From 6f2d3104c82f81c1f0123a3cfb25ae670841d0ba Mon Sep 17 00:00:00 2001 From: Lazar Trsic Date: Tue, 13 Oct 2015 16:43:00 +0200 Subject: [PATCH] Correctly resolve realpath for absolute paths Introduced by: https://android-review.googlesource.com/174475 Change-Id: I44e00040b28be167d5141454f919340afec6084e --- linker/linker.cpp | 4 ++++ tests/dlfcn_test.cpp | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/linker/linker.cpp b/linker/linker.cpp index 841b9575f..4e899c312 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1318,6 +1318,10 @@ static int open_library(ZipArchiveCache* zip_archive_cache, int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CLOEXEC)); if (fd != -1) { *file_offset = 0; + if (!realpath_fd(fd, realpath)) { + PRINT("warning: unable to get realpath for the library \"%s\". Will use given path.", name); + *realpath = name; + } } return fd; } diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp index 00cbdc6fd..ed972ba23 100644 --- a/tests/dlfcn_test.cpp +++ b/tests/dlfcn_test.cpp @@ -830,10 +830,11 @@ TEST(dlfcn, dladdr_executable) { } #if defined(__LP64__) -#define BIONIC_PATH_TO_LIBC "/system/lib64/libc.so" +#define PATH_TO_SYSTEM_LIB "/system/lib64/" #else -#define BIONIC_PATH_TO_LIBC "/system/lib/libc.so" +#define PATH_TO_SYSTEM_LIB "/system/lib/" #endif +#define PATH_TO_LIBC PATH_TO_SYSTEM_LIB "libc.so" TEST(dlfcn, dladdr_libc) { #if defined(__BIONIC__) @@ -843,7 +844,7 @@ TEST(dlfcn, dladdr_libc) { // /system/lib is symlink when this test is executed on host. char libc_realpath[PATH_MAX]; - ASSERT_TRUE(realpath(BIONIC_PATH_TO_LIBC, libc_realpath) == libc_realpath); + ASSERT_TRUE(realpath(PATH_TO_LIBC, libc_realpath) == libc_realpath); ASSERT_STREQ(libc_realpath, info.dli_fname); // TODO: add check for dfi_fbase @@ -1063,7 +1064,7 @@ extern "C" int version_zero_function2() { return 0; } -TEST(dlfcn, dt_runpath) { +TEST(dlfcn, dt_runpath_smoke) { void* handle = dlopen("libtest_dt_runpath_d.so", RTLD_NOW); ASSERT_TRUE(handle != nullptr) << dlerror(); @@ -1076,3 +1077,17 @@ TEST(dlfcn, dt_runpath) { dlclose(handle); } + +TEST(dlfcn, dt_runpath_absolute_path) { + void* handle = dlopen(PATH_TO_SYSTEM_LIB "libtest_dt_runpath_d.so", RTLD_NOW); + ASSERT_TRUE(handle != nullptr) << dlerror(); + + typedef void *(* dlopen_b_fn)(); + dlopen_b_fn fn = (dlopen_b_fn)dlsym(handle, "dlopen_b"); + ASSERT_TRUE(fn != nullptr) << dlerror(); + + void *p = fn(); + ASSERT_TRUE(p != nullptr); + + dlclose(handle); +}