aboutsummaryrefslogtreecommitdiffstats
path: root/tests/dlext_test.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2014-11-04 11:08:05 -0800
committerYabin Cui <yabinc@google.com>2014-11-04 14:37:15 -0800
commit16f7f8d2503a9033a09a4d7e857561d63471bb82 (patch)
tree6e90ea6e751a2a1b256a88d97e7a5fa81df80459 /tests/dlext_test.cpp
parent695781b6f0419f82939176a6ec1a240300d9f036 (diff)
downloadandroid_bionic-16f7f8d2503a9033a09a4d7e857561d63471bb82.tar.gz
android_bionic-16f7f8d2503a9033a09a4d7e857561d63471bb82.tar.bz2
android_bionic-16f7f8d2503a9033a09a4d7e857561d63471bb82.zip
check invalid file offset when loading library
Bug: 18178121 Bug: 18078224 Change-Id: I5254433d54645db68e9b83d5095dc2bf9d8531bc
Diffstat (limited to 'tests/dlext_test.cpp')
-rw-r--r--tests/dlext_test.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index 58add6b95..5b3136458 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -17,8 +17,10 @@
#include <gtest/gtest.h>
#include <dlfcn.h>
+#include <elf.h>
#include <errno.h>
#include <fcntl.h>
+#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -39,6 +41,9 @@
#define ASSERT_NOERROR(i) \
ASSERT_NE(-1, i) << "errno: " << strerror(errno)
+#define ASSERT_SUBSTR(needle, haystack) \
+ ASSERT_PRED_FORMAT2(::testing::IsSubstring, needle, haystack)
+
typedef int (*fn)(void);
#define LIBNAME "libdlext_test.so"
@@ -138,7 +143,7 @@ TEST_F(DlExtTest, ExtInfoUseFdWithInvalidOffset) {
ASSERT_TRUE(android_data != nullptr);
char lib_path[PATH_MAX];
- snprintf(lib_path, sizeof(lib_path), LIBZIPPATH, android_data);
+ snprintf(lib_path, sizeof(lib_path), LIBPATH, android_data);
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_USE_LIBRARY_FD | ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET;
@@ -149,11 +154,20 @@ TEST_F(DlExtTest, ExtInfoUseFdWithInvalidOffset) {
ASSERT_TRUE(handle_ == nullptr);
ASSERT_STREQ("dlopen failed: file offset for the library \"libname_placeholder\" is not page-aligned: 17", dlerror());
- extinfo.library_fd_offset = (5LL<<58) + PAGE_SIZE;
+ // Test an address above 2^44, for http://b/18178121 .
+ extinfo.library_fd_offset = (5LL<<48) + PAGE_SIZE;
+ handle_ = android_dlopen_ext("libname_placeholder", RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle_ == nullptr);
+ ASSERT_SUBSTR("dlopen failed: file offset for the library \"libname_placeholder\" >= file size", dlerror());
+
+ extinfo.library_fd_offset = 0LL - PAGE_SIZE;
handle_ = android_dlopen_ext("libname_placeholder", RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle_ == nullptr);
+ ASSERT_SUBSTR("dlopen failed: file offset for the library \"libname_placeholder\" is negative", dlerror());
+ extinfo.library_fd_offset = PAGE_SIZE;
+ handle_ = android_dlopen_ext("libname_placeholder", RTLD_NOW, &extinfo);
ASSERT_TRUE(handle_ == nullptr);
- // TODO: Better error message when reading with offset > file_size
ASSERT_STREQ("dlopen failed: \"libname_placeholder\" has bad ELF magic", dlerror());
close(extinfo.library_fd);