Check for unknown flags passed to dlopen(3).
Change-Id: I56f4aab0e5a1487bc32d2c4d231e8bd15c4ac8da
diff --git a/linker/Android.mk b/linker/Android.mk
index b757030..5fccf9b 100644
--- a/linker/Android.mk
+++ b/linker/Android.mk
@@ -8,21 +8,21 @@
endif
LOCAL_SRC_FILES:= \
- arch/$(TARGET_ARCH)/begin.$(linker_begin_extension) \
- debugger.cpp \
- dlfcn.cpp \
- linker.cpp \
- linker_environ.cpp \
- linker_format.cpp \
- linker_phdr.cpp \
- rt.cpp
+ arch/$(TARGET_ARCH)/begin.$(linker_begin_extension) \
+ debugger.cpp \
+ dlfcn.cpp \
+ linker.cpp \
+ linker_environ.cpp \
+ linker_format.cpp \
+ linker_phdr.cpp \
+ rt.cpp
LOCAL_LDFLAGS := -shared
LOCAL_CFLAGS += -fno-stack-protector \
-Wstrict-overflow=5 \
-fvisibility=hidden \
- -Wall -Wextra
+ -Wall -Wextra -Werror
# We need to access Bionic private headers in the linker...
LOCAL_CFLAGS += -I$(LOCAL_PATH)/../libc/
diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp
index 24006e2..2184f3a 100644
--- a/linker/dlfcn.cpp
+++ b/linker/dlfcn.cpp
@@ -55,9 +55,9 @@
return old_value;
}
-void* dlopen(const char* filename, int flag) {
+void* dlopen(const char* filename, int flags) {
ScopedPthreadMutexLocker locker(&gDlMutex);
- soinfo* result = do_dlopen(filename);
+ soinfo* result = do_dlopen(filename, flags);
if (result == NULL) {
__bionic_format_dlerror("dlopen failed", linker_get_error());
return NULL;
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 0d0a8a9..0bdff99 100755
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -966,7 +966,11 @@
return 0;
}
-soinfo* do_dlopen(const char* name) {
+soinfo* do_dlopen(const char* name, int flags) {
+ if ((flags & ~(RTLD_NOW|RTLD_LAZY|RTLD_LOCAL|RTLD_GLOBAL)) != 0) {
+ DL_ERR("invalid flags to dlopen: %x", flags);
+ return NULL;
+ }
set_soinfo_pool_protection(PROT_READ | PROT_WRITE);
soinfo* si = find_library(name);
if (si != NULL) {
diff --git a/linker/linker.h b/linker/linker.h
index 51869e7..60c76fa 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -207,7 +207,7 @@
#define DT_PREINIT_ARRAYSZ 33
#endif
-soinfo* do_dlopen(const char* name);
+soinfo* do_dlopen(const char* name, int flags);
int do_dlclose(soinfo* si);
Elf32_Sym* lookup(const char* name, soinfo** found, soinfo* start);