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__)