diff options
author | Jiyong Park <jiyong@google.com> | 2017-10-16 15:31:09 +0900 |
---|---|---|
committer | Jiyong Park <jiyong@google.com> | 2017-10-19 15:13:54 +0900 |
commit | 01162f24696aedd0f80fde006596bec7786ac684 (patch) | |
tree | df56be16f8b8caffdb1b8ed76ea7634ef7934476 | |
parent | 8f57fd41790883ce210866a5a20d77cc910c87ad (diff) | |
download | bionic-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.cpp | 10 | ||||
-rw-r--r-- | tests/dlfcn_test.cpp | 5 | ||||
-rw-r--r-- | tests/libs/Android.bp | 20 | ||||
-rw-r--r-- | tests/libs/dl_df_1_global_dummy.cpp | 19 |
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; +} |