summaryrefslogtreecommitdiffstats
path: root/linker
diff options
context:
space:
mode:
authorSpencer Low <CompareAndSwap@gmail.com>2015-04-22 18:06:51 -0700
committerElliott Hughes <enh@google.com>2015-05-13 17:47:08 -0700
commit2a44cfbd7d64596795836e9ae6f6c642869d6d78 (patch)
tree663db4753a75f5de7fe2fb1f518d48682bd97167 /linker
parent4bac6ea463a8f20793f5c1425965729ded1419fe (diff)
downloadbionic-2a44cfbd7d64596795836e9ae6f6c642869d6d78.zip
bionic-2a44cfbd7d64596795836e9ae6f6c642869d6d78.tar.gz
bionic-2a44cfbd7d64596795836e9ae6f6c642869d6d78.tar.bz2
ScopedFd: Don't use TEMP_FAILURE_RETRY() with close()
According to the comments in Posix_close(), TEMP_FAILURE_RETRY() should not be used with close(): https://android.googlesource.com/platform/libcore/+/462bdac45c10f43d88d8f07f6994e272a27c14a2%5E%21/#F12 Kill ScopedFd by simplifying the single caller. Bug: http://b/20501816 Change-Id: I248c40b8c2fc95f1938a6edfc245c81847fc44af Signed-off-by: Spencer Low <CompareAndSwap@gmail.com> (cherry picked from commit 0346ad7a4fb6e253317577ee8b9cc79d958f4349)
Diffstat (limited to 'linker')
-rw-r--r--linker/linker.cpp47
1 files changed, 25 insertions, 22 deletions
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 64b6d4d..9d796ae 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -47,7 +47,6 @@
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
#include "private/ScopedPthreadMutexLocker.h"
-#include "private/ScopedFd.h"
#include "private/ScopeGuard.h"
#include "private/UniquePtr.h"
@@ -1225,29 +1224,10 @@ static void for_each_dt_needed(const soinfo* si, F action) {
}
}
-static soinfo* load_library(LoadTaskList& load_tasks,
+static soinfo* load_library(int fd, off64_t file_offset,
+ LoadTaskList& load_tasks,
const char* name, int rtld_flags,
const android_dlextinfo* extinfo) {
- int fd = -1;
- off64_t file_offset = 0;
- ScopedFd file_guard(-1);
-
- if (extinfo != nullptr && (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) != 0) {
- fd = extinfo->library_fd;
- if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
- file_offset = extinfo->library_fd_offset;
- }
- } else {
- // Open the file.
- fd = open_library(name, &file_offset);
- if (fd == -1) {
- DL_ERR("library \"%s\" not found", name);
- return nullptr;
- }
-
- file_guard.reset(fd);
- }
-
if ((file_offset % PAGE_SIZE) != 0) {
DL_ERR("file offset for the library \"%s\" is not page-aligned: %" PRId64, name, file_offset);
return nullptr;
@@ -1323,6 +1303,29 @@ static soinfo* load_library(LoadTaskList& load_tasks,
return si;
}
+static soinfo* load_library(LoadTaskList& load_tasks,
+ const char* name, int rtld_flags,
+ const android_dlextinfo* extinfo) {
+ if (extinfo != nullptr && (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) != 0) {
+ off64_t file_offset = 0;
+ if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
+ file_offset = extinfo->library_fd_offset;
+ }
+ return load_library(extinfo->library_fd, file_offset, load_tasks, name, rtld_flags, extinfo);
+ }
+
+ // Open the file.
+ off64_t file_offset;
+ int fd = open_library(name, &file_offset);
+ if (fd == -1) {
+ DL_ERR("library \"%s\" not found", name);
+ return nullptr;
+ }
+ soinfo* result = load_library(fd, file_offset, load_tasks, name, rtld_flags, extinfo);
+ close(fd);
+ return result;
+}
+
static soinfo *find_loaded_library_by_soname(const char* name) {
// Ignore filename with path.
if (strchr(name, '/') != nullptr) {