Index: third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp |
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp |
index 1ca932109ddcbed447c11be7dfde8ccbf0764143..444b62a4ca64328189ff6504e5fa6d5e1d5452b0 100644 |
--- a/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp |
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_library_list.cpp |
@@ -4,6 +4,7 @@ |
#include "crazy_linker_library_list.h" |
+#include <assert.h> |
#include <dlfcn.h> |
#include "crazy_linker_debug.h" |
@@ -19,6 +20,14 @@ namespace crazy { |
namespace { |
+// Maximum filename length of a file in a zip file. |
+const size_t kMaxFilenameInZip = 256; |
+ |
+// Page size for alignment in a zip file. |
+const size_t kZipAlignmentPageSize = 4096; |
+static_assert(kZipAlignmentPageSize % PAGE_SIZE == 0, |
+ "kZipAlignmentPageSize must be a multiple of PAGE_SIZE"); |
+ |
// A helper struct used when looking up symbols in libraries. |
struct SymbolLookupState { |
void* found_addr; |
@@ -392,15 +401,10 @@ LibraryView* LibraryList::LoadLibrary(const char* lib_name, |
#error "Unsupported target abi" |
#endif |
-const size_t kMaxFilenameInZip = 256; |
-const size_t kPageSize = 4096; |
- |
-LibraryView* LibraryList::LoadLibraryInZipFile(const char* zip_file_path, |
- const char* lib_name, |
- int dlopen_flags, |
- uintptr_t load_address, |
- SearchPathList* search_path_list, |
- Error* error) { |
+int LibraryList::FindAlignedLibraryInZipFile( |
+ const char* zip_file_path, |
+ const char* lib_name, |
+ Error* error) { |
String fullname; |
fullname.Reserve(kMaxFilenameInZip); |
fullname = "lib/"; |
@@ -411,17 +415,34 @@ LibraryView* LibraryList::LoadLibraryInZipFile(const char* zip_file_path, |
if (fullname.size() + 1 > kMaxFilenameInZip) { |
error->Format("Filename too long for a file in a zip file %s\n", |
fullname.c_str()); |
- return NULL; |
+ return CRAZY_OFFSET_FAILED; |
} |
int offset = FindStartOffsetOfFileInZipFile(zip_file_path, fullname.c_str()); |
- if (offset == -1) { |
- return NULL; |
+ if (offset == CRAZY_OFFSET_FAILED) { |
+ return CRAZY_OFFSET_FAILED; |
} |
- if ((offset & (kPageSize - 1)) != 0) { |
+ static_assert((kZipAlignmentPageSize & (kZipAlignmentPageSize - 1)) == 0, |
+ "kZipAlignmentPageSize must be a power of 2"); |
+ if ((offset & (kZipAlignmentPageSize - 1)) != 0) { |
error->Format("Library %s is not page aligned in zipfile %s\n", |
lib_name, zip_file_path); |
+ return CRAZY_OFFSET_FAILED; |
+ } |
+ |
+ assert(offset != CRAZY_OFFSET_FAILED); |
+ return offset; |
+} |
+ |
+LibraryView* LibraryList::LoadLibraryInZipFile(const char* zip_file_path, |
+ const char* lib_name, |
+ int dlopen_flags, |
+ uintptr_t load_address, |
+ SearchPathList* search_path_list, |
+ Error* error) { |
+ int offset = FindAlignedLibraryInZipFile(zip_file_path, lib_name, error); |
+ if (offset == CRAZY_OFFSET_FAILED) { |
return NULL; |
} |