am d74aa580: Merge "Fix unload of recursively linked library"
				
					
				
			* commit 'd74aa580354037b9972524e9d654c0a336974838': Fix unload of recursively linked library
This commit is contained in:
		@@ -839,6 +839,7 @@ static soinfo* load_library(LoadTaskList& load_tasks, const char* name, int dlfl
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((dlflags & RTLD_NOLOAD) != 0) {
 | 
					  if ((dlflags & RTLD_NOLOAD) != 0) {
 | 
				
			||||||
 | 
					    DL_ERR("library \"%s\" wasn't loaded and RTLD_NOLOAD prevented it", name);
 | 
				
			||||||
    return nullptr;
 | 
					    return nullptr;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -946,7 +947,6 @@ static bool find_libraries(const char* const library_names[], size_t library_nam
 | 
				
			|||||||
    soinfo* needed_by = task->get_needed_by();
 | 
					    soinfo* needed_by = task->get_needed_by();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (is_recursive(si, needed_by)) {
 | 
					    if (is_recursive(si, needed_by)) {
 | 
				
			||||||
      soinfo_free(si);
 | 
					 | 
				
			||||||
      return false;
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -207,8 +207,19 @@ TEST(dlfcn, dlopen_check_order) {
 | 
				
			|||||||
// libtest_with_dependency_loop_a.so
 | 
					// libtest_with_dependency_loop_a.so
 | 
				
			||||||
TEST(dlfcn, dlopen_check_loop) {
 | 
					TEST(dlfcn, dlopen_check_loop) {
 | 
				
			||||||
  void* handle = dlopen("libtest_with_dependency_loop.so", RTLD_NOW);
 | 
					  void* handle = dlopen("libtest_with_dependency_loop.so", RTLD_NOW);
 | 
				
			||||||
  ASSERT_TRUE(handle == NULL);
 | 
					  ASSERT_TRUE(handle == nullptr);
 | 
				
			||||||
  ASSERT_STREQ("dlopen failed: recursive link to \"libtest_with_dependency_loop_a.so\"", dlerror());
 | 
					  ASSERT_STREQ("dlopen failed: recursive link to \"libtest_with_dependency_loop_a.so\"", dlerror());
 | 
				
			||||||
 | 
					  // This symbol should never be exposed
 | 
				
			||||||
 | 
					  void* f = dlsym(RTLD_DEFAULT, "dlopen_test_invalid_function");
 | 
				
			||||||
 | 
					  ASSERT_TRUE(f == nullptr);
 | 
				
			||||||
 | 
					  ASSERT_SUBSTR("undefined symbol: dlopen_test_invalid_function", dlerror());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // dlopen second time to make sure that the library wasn't loaded even though dlopen returned null.
 | 
				
			||||||
 | 
					  // This may happen if during cleanup the root library or one of the depended libs were not removed
 | 
				
			||||||
 | 
					  // from soinfo list.
 | 
				
			||||||
 | 
					  handle = dlopen("libtest_with_dependency_loop.so", RTLD_NOW | RTLD_NOLOAD);
 | 
				
			||||||
 | 
					  ASSERT_TRUE(handle == nullptr);
 | 
				
			||||||
 | 
					  ASSERT_STREQ("dlopen failed: library \"libtest_with_dependency_loop.so\" wasn't loaded and RTLD_NOLOAD prevented it", dlerror());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(dlfcn, dlopen_failure) {
 | 
					TEST(dlfcn, dlopen_failure) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -196,7 +196,7 @@ include $(TEST_PATH)/Android.build.mk
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# libtest_with_dependency_loop -> a -> b -> c -> a
 | 
					# libtest_with_dependency_loop -> a -> b -> c -> a
 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
libtest_with_dependency_loop_src_files := empty.cpp
 | 
					libtest_with_dependency_loop_src_files := dlopen_testlib_invalid.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libtest_with_dependency_loop_shared_libraries := \
 | 
					libtest_with_dependency_loop_shared_libraries := \
 | 
				
			||||||
    libtest_with_dependency_loop_a
 | 
					    libtest_with_dependency_loop_a
 | 
				
			||||||
@@ -209,7 +209,7 @@ include $(TEST_PATH)/Android.build.mk
 | 
				
			|||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
# libtest_with_dependency_loop_a.so
 | 
					# libtest_with_dependency_loop_a.so
 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
libtest_with_dependency_loop_a_src_files := empty.cpp
 | 
					libtest_with_dependency_loop_a_src_files := dlopen_testlib_invalid.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libtest_with_dependency_loop_a_shared_libraries := \
 | 
					libtest_with_dependency_loop_a_shared_libraries := \
 | 
				
			||||||
    libtest_with_dependency_loop_b_tmp
 | 
					    libtest_with_dependency_loop_b_tmp
 | 
				
			||||||
@@ -224,7 +224,7 @@ include $(TEST_PATH)/Android.build.mk
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# this is temporary placeholder - will be removed
 | 
					# this is temporary placeholder - will be removed
 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
libtest_with_dependency_loop_b_tmp_src_files := empty.cpp
 | 
					libtest_with_dependency_loop_b_tmp_src_files := dlopen_testlib_invalid.cpp
 | 
				
			||||||
libtest_with_dependency_loop_b_tmp_ldflags := -Wl,-soname=libtest_with_dependency_loop_b.so
 | 
					libtest_with_dependency_loop_b_tmp_ldflags := -Wl,-soname=libtest_with_dependency_loop_b.so
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module := libtest_with_dependency_loop_b_tmp
 | 
					module := libtest_with_dependency_loop_b_tmp
 | 
				
			||||||
@@ -235,7 +235,7 @@ include $(TEST_PATH)/Android.build.mk
 | 
				
			|||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
# libtest_with_dependency_loop_b.so
 | 
					# libtest_with_dependency_loop_b.so
 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
libtest_with_dependency_loop_b_src_files := empty.cpp
 | 
					libtest_with_dependency_loop_b_src_files := dlopen_testlib_invalid.cpp
 | 
				
			||||||
libtest_with_dependency_loop_b_shared_libraries := libtest_with_dependency_loop_c
 | 
					libtest_with_dependency_loop_b_shared_libraries := libtest_with_dependency_loop_c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module := libtest_with_dependency_loop_b
 | 
					module := libtest_with_dependency_loop_b
 | 
				
			||||||
@@ -246,7 +246,7 @@ include $(TEST_PATH)/Android.build.mk
 | 
				
			|||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
# libtest_with_dependency_loop_c.so
 | 
					# libtest_with_dependency_loop_c.so
 | 
				
			||||||
# -----------------------------------------------------------------------------
 | 
					# -----------------------------------------------------------------------------
 | 
				
			||||||
libtest_with_dependency_loop_c_src_files := empty.cpp
 | 
					libtest_with_dependency_loop_c_src_files := dlopen_testlib_invalid.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libtest_with_dependency_loop_c_shared_libraries := \
 | 
					libtest_with_dependency_loop_c_shared_libraries := \
 | 
				
			||||||
    libtest_with_dependency_loop_a
 | 
					    libtest_with_dependency_loop_a
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								tests/libs/dlopen_testlib_invalid.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								tests/libs/dlopen_testlib_invalid.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2014 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This file is used for libraries that are not supposed to
 | 
				
			||||||
 | 
					// be successfully loaded/linked - therefore, this function should
 | 
				
			||||||
 | 
					// not be visible via dlsym - (we are going to use this fact in tests)
 | 
				
			||||||
 | 
					extern "C" int dlopen_test_invalid_function() {
 | 
				
			||||||
 | 
					  abort();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user