From ca1c80220e9b16fde7a761ca1c2c63dbe8071e0f Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov <dimitry@google.com> Date: Wed, 21 May 2014 22:42:24 -0700 Subject: [PATCH] Removed dlsym handle != NULL check for lp64 * Removed unnecessary NULL check in dlsym * Fixed dlsym_failure test to account for correct RTLD_DEFAULT value * Added temporary check for legacy RTLD_DEFAULT value for non-yet-recompiled binaries Bug: 15146875 Change-Id: I089fa673762629f5724b6e4fbca019d9cfc39905 --- linker/dlfcn.cpp | 7 +++++-- tests/dlfcn_test.cpp | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp index 7e3b3f41d..7bcb59f16 100644 --- a/linker/dlfcn.cpp +++ b/linker/dlfcn.cpp @@ -89,10 +89,13 @@ void* dlopen(const char* filename, int flags) { void* dlsym(void* handle, const char* symbol) { ScopedPthreadMutexLocker locker(&g_dl_mutex); +#if !defined(__LP64__) if (handle == NULL) { __bionic_format_dlerror("dlsym library handle is null", NULL); return NULL; } +#endif + if (symbol == NULL) { __bionic_format_dlerror("dlsym symbol name is null", NULL); return NULL; @@ -100,9 +103,9 @@ void* dlsym(void* handle, const char* symbol) { soinfo* found = NULL; ElfW(Sym)* sym = NULL; - if (handle == RTLD_DEFAULT) { + if (handle == RTLD_DEFAULT || handle == (void*)0xffffffffL) { sym = dlsym_linear_lookup(symbol, &found, NULL); - } else if (handle == RTLD_NEXT || handle == (void*)0xffffffffL) { + } else if (handle == RTLD_NEXT || handle == (void*)0xfffffffeL) { void* caller_addr = __builtin_return_address(0); soinfo* si = find_containing_library(caller_addr); diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index 434e38f91..3459a562e 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -101,6 +101,8 @@ TEST(dlfcn, dlsym_failures) { void* sym; + // lp64 RTLD_DEFAULT=(void*)0 +#if !defined(__LP64__) // NULL handle. sym = dlsym(NULL, "test"); ASSERT_TRUE(sym == NULL); @@ -109,6 +111,7 @@ TEST(dlfcn, dlsym_failures) { #else ASSERT_SUBSTR("undefined symbol: test", dlerror()); // glibc isn't specific about the failure. #endif +#endif // !defined(__LP64__) // NULL symbol name. #if defined(__BIONIC__)