Merge "Apply permitted path to the classloader-namespace"

This commit is contained in:
Dimitry Ivanov 2015-12-10 04:34:38 +00:00 committed by Gerrit Code Review
commit 028aa205af
2 changed files with 24 additions and 9 deletions

View file

@ -24,7 +24,7 @@ namespace android {
__attribute__((visibility("default"))) __attribute__((visibility("default")))
void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path, void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
jobject class_loader, jstring library_path); jobject class_loader, jstring library_path, jstring permitted_path);
}; // namespace android }; // namespace android

View file

@ -55,10 +55,18 @@ class LibraryNamespaces {
public: public:
LibraryNamespaces() : initialized_(false) { } LibraryNamespaces() : initialized_(false) { }
android_namespace_t* GetOrCreate(JNIEnv* env, jobject class_loader, jstring library_path) { android_namespace_t* GetOrCreate(JNIEnv* env, jobject class_loader,
ScopedUtfChars libraryPath(env, library_path); jstring java_library_path,
jstring java_permitted_path) {
ScopedUtfChars library_path(env, java_library_path);
if (!initialized_ && !InitPublicNamespace(libraryPath.c_str())) { std::string permitted_path;
if (java_permitted_path != nullptr) {
ScopedUtfChars path(env, java_permitted_path);
permitted_path = path.c_str();
}
if (!initialized_ && !InitPublicNamespace(library_path.c_str())) {
return nullptr; return nullptr;
} }
@ -73,8 +81,11 @@ class LibraryNamespaces {
android_namespace_t* ns = android_namespace_t* ns =
android_create_namespace("classloader-namespace", android_create_namespace("classloader-namespace",
nullptr, nullptr,
libraryPath.c_str(), library_path.c_str(),
true); true,
java_permitted_path != nullptr ?
permitted_path.c_str() :
nullptr);
namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns)); namespaces_.push_back(std::make_pair(env->NewWeakGlobalRef(class_loader), ns));
@ -118,13 +129,16 @@ static LibraryNamespaces* g_namespaces = new LibraryNamespaces;
void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path, void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
jobject class_loader, jstring library_path) { jobject class_loader, jstring java_library_path,
jstring java_permitted_path) {
#if defined(__ANDROID__) #if defined(__ANDROID__)
if (target_sdk_version == 0 || class_loader == nullptr) { if (target_sdk_version == 0 || class_loader == nullptr) {
return dlopen(path, RTLD_NOW); return dlopen(path, RTLD_NOW);
} }
android_namespace_t* ns = g_namespaces->GetOrCreate(env, class_loader, library_path); android_namespace_t* ns =
g_namespaces->GetOrCreate(env, class_loader, java_library_path,
java_permitted_path);
if (ns == nullptr) { if (ns == nullptr) {
return nullptr; return nullptr;
@ -136,7 +150,8 @@ void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* pat
return android_dlopen_ext(path, RTLD_NOW, &extinfo); return android_dlopen_ext(path, RTLD_NOW, &extinfo);
#else #else
UNUSED(env, target_sdk_version, class_loader, library_path); UNUSED(env, target_sdk_version, class_loader,
java_library_path, java_permitted_path);
return dlopen(path, RTLD_NOW); return dlopen(path, RTLD_NOW);
#endif #endif
} }