aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiyong Park <jiyong@google.com>2017-10-16 15:31:09 +0900
committerJiyong Park <jiyong@google.com>2017-10-19 15:13:54 +0900
commit01162f24696aedd0f80fde006596bec7786ac684 (patch)
treedf56be16f8b8caffdb1b8ed76ea7634ef7934476
parent8f57fd41790883ce210866a5a20d77cc910c87ad (diff)
downloadbionic-01162f24696aedd0f80fde006596bec7786ac684.tar.gz
Fix: linker segfault on dlopen of a DF_1_GLOBAL so
Added the missing null check routine. Bug: 67755729 Test: dlfcn.dlopen_df_1_global added and it passes Change-Id: Ibe8db18b0b5a481e2e9937041abef6d6b179dd87
-rw-r--r--linker/linker.cpp10
-rw-r--r--tests/dlfcn_test.cpp5
-rw-r--r--tests/libs/Android.bp20
-rw-r--r--tests/libs/dl_df_1_global_dummy.cpp19
4 files changed, 50 insertions, 4 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp
index f6ca43066..ec92c9205 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1621,11 +1621,13 @@ bool find_libraries(android_namespace_t* ns,
}
// Step 4-3: Add the new global group members to all the linked namespaces
- for (auto si : new_global_group_members) {
+ if (namespaces != nullptr) {
for (auto linked_ns : *namespaces) {
- if (si->get_primary_namespace() != linked_ns) {
- linked_ns->add_soinfo(si);
- si->add_secondary_namespace(linked_ns);
+ for (auto si : new_global_group_members) {
+ if (si->get_primary_namespace() != linked_ns) {
+ linked_ns->add_soinfo(si);
+ si->add_secondary_namespace(linked_ns);
+ }
}
}
}
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index adc5ee4b1..697b84a42 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -1496,4 +1496,9 @@ TEST(dlfcn, dlopen_invalid_textrels2) {
ASSERT_SUBSTR(expected_dlerror.c_str(), dlerror());
}
+TEST(dlfcn, dlopen_df_1_global) {
+ void* handle = dlopen("libtest_dlopen_df_1_global.so", RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+}
+
#endif
diff --git a/tests/libs/Android.bp b/tests/libs/Android.bp
index 858f2b1cb..ba0b1aaf7 100644
--- a/tests/libs/Android.bp
+++ b/tests/libs/Android.bp
@@ -377,6 +377,26 @@ cc_test_library {
}
// -----------------------------------------------------------------------------
+// Library with DF_1_GLOBAL which will be dlopened
+// (note: libdl_test_df_1_global above will be included in DT_NEEDED)
+// -----------------------------------------------------------------------------
+cc_test_library {
+ name: "libtest_dlopen_df_1_global",
+ defaults: ["bionic_testlib_defaults"],
+ srcs: ["dl_df_1_global_dummy.cpp"],
+ ldflags: ["-Wl,-z,global"],
+
+ target: {
+ host: {
+ // TODO (dimitry): host ld.gold does not yet support -z global
+ // remove this line once it is updated.
+ ldflags: ["-fuse-ld=bfd"],
+ },
+ },
+}
+
+
+// -----------------------------------------------------------------------------
// Library with weak function
// -----------------------------------------------------------------------------
cc_test_library {
diff --git a/tests/libs/dl_df_1_global_dummy.cpp b/tests/libs/dl_df_1_global_dummy.cpp
new file mode 100644
index 000000000..423247c66
--- /dev/null
+++ b/tests/libs/dl_df_1_global_dummy.cpp
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern "C" int foo() {
+ return 1;
+}