Load the library using classloader\'s namespace.
am: ad75a55

* commit 'ad75a55a161c28a96c3cf1a2ad6bda28ea5e9799':
  Load the library using classloader's namespace.
diff --git a/chromium/Android.mk b/chromium/Android.mk
index 102afb1..f200fba 100644
--- a/chromium/Android.mk
+++ b/chromium/Android.mk
@@ -69,6 +69,7 @@
 LOCAL_SHARED_LIBRARIES += \
         libdl \
         liblog \
+        libnativeloader \
 
 LOCAL_MODULE_TAGS := optional
 
diff --git a/chromium/loader/loader.cpp b/chromium/loader/loader.cpp
index 87f7226..91c0a21 100644
--- a/chromium/loader/loader.cpp
+++ b/chromium/loader/loader.cpp
@@ -31,6 +31,7 @@
 
 #include <jni.h>
 #include <android/dlext.h>
+#include <nativeloader/native_loader.h>
 #include <utils/Log.h>
 
 #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
@@ -45,6 +46,7 @@
 jint LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
 jint LIBLOAD_FAILED_TO_LOAD_LIBRARY;
 jint LIBLOAD_FAILED_JNI_CALL;
+jint LIBLOAD_FAILED_TO_FIND_NAMESPACE;
 
 jboolean DoReserveAddressSpace(jlong size) {
   size_t vsize = static_cast<size_t>(size);
@@ -103,17 +105,26 @@
   return JNI_TRUE;
 }
 
-jint DoLoadWithRelroFile(const char* lib, const char* relro) {
+jint DoLoadWithRelroFile(JNIEnv* env, const char* lib, const char* relro,
+                         jobject clazzLoader) {
   int relro_fd = TEMP_FAILURE_RETRY(open(relro, O_RDONLY));
   if (relro_fd == -1) {
     ALOGE("Failed to open relro file %s: %s", relro, strerror(errno));
     return LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
   }
+  android_namespace_t* ns =
+      android::FindNamespaceByClassLoader(env, clazzLoader);
+  if (ns == NULL) {
+    ALOGE("Failed to find classloader namespace");
+    return LIBLOAD_FAILED_TO_FIND_NAMESPACE;
+  }
   android_dlextinfo extinfo;
-  extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO;
+  extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO |
+                  ANDROID_DLEXT_USE_NAMESPACE;
   extinfo.reserved_addr = gReservedAddress;
   extinfo.reserved_size = gReservedSize;
   extinfo.relro_fd = relro_fd;
+  extinfo.library_namespace = ns;
   void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo);
   close(relro_fd);
   if (handle == NULL) {
@@ -157,7 +168,7 @@
 }
 
 jint LoadWithRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64,
-                           jstring relro32, jstring relro64) {
+                       jstring relro32, jstring relro64, jobject clazzLoader) {
 #ifdef __LP64__
   jstring lib = lib64;
   jstring relro = relro64;
@@ -172,7 +183,7 @@
   if (lib_utf8 != NULL) {
     const char* relro_utf8 = env->GetStringUTFChars(relro, NULL);
     if (relro_utf8 != NULL) {
-      ret = DoLoadWithRelroFile(lib_utf8, relro_utf8);
+      ret = DoLoadWithRelroFile(env, lib_utf8, relro_utf8, clazzLoader);
       env->ReleaseStringUTFChars(relro, relro_utf8);
     }
     env->ReleaseStringUTFChars(lib, lib_utf8);
@@ -188,7 +199,7 @@
       "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
       reinterpret_cast<void*>(CreateRelroFile) },
   { "nativeLoadWithRelroFile",
-      "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
+      "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)I",
       reinterpret_cast<void*>(LoadWithRelroFile) },
 };
 
@@ -216,6 +227,10 @@
     LIBLOAD_FAILED_JNI_CALL = env->GetStaticIntField(
         clazz,
         env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_JNI_CALL", "I"));
+
+    LIBLOAD_FAILED_TO_FIND_NAMESPACE = env->GetStaticIntField(
+        clazz,
+        env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_FIND_NAMESPACE", "I"));
   }
 }