diff options
| author | Jiyong Park <jiyong@google.com> | 2018-06-05 10:58:57 -0700 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2018-06-05 10:58:57 -0700 |
| commit | 22fbbd1f3338e95054b7a10fd13a3820fed9171f (patch) | |
| tree | 112ba5b3762c54a2ee7db2d6d0b4472464e00a06 /core/java | |
| parent | df3cf2b39ded7070ae695ff9cfe40992b866919f (diff) | |
| parent | 0221eaa392c6b8b29dae9d0c41924901f9f136a9 (diff) | |
Merge "Fix: vendor public libraries are accessible via System.loadLibrary" into pi-dev am: c4b6bd34e1
am: 0221eaa392
Change-Id: I20f644dbafb96955e96f22ecef61292ffeae9e7f
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/LoadedApk.java | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 9db642bb18a3..494b5474ad00 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -745,6 +745,44 @@ public final class LoadedApk { } } + // /vendor/lib, /odm/lib and /product/lib are added to the native lib search + // paths of the classloader. Note that this is done AFTER the classloader is + // created by ApplicationLoaders.getDefault().getClassLoader(...). The + // reason is because if we have added the paths when creating the classloader + // above, the paths are also added to the search path of the linker namespace + // 'classloader-namespace', which will allow ALL libs in the paths to apps. + // Since only the libs listed in <partition>/etc/public.libraries.txt can be + // available to apps, we shouldn't add the paths then. + // + // However, we need to add the paths to the classloader (Java) though. This + // is because when a native lib is requested via System.loadLibrary(), the + // classloader first tries to find the requested lib in its own native libs + // search paths. If a lib is not found in one of the paths, dlopen() is not + // called at all. This can cause a problem that a vendor public native lib + // is accessible when directly opened via dlopen(), but inaccesible via + // System.loadLibrary(). In order to prevent the problem, we explicitly + // add the paths only to the classloader, and not to the native loader + // (linker namespace). + List<String> extraLibPaths = new ArrayList<>(3); + String abiSuffix = VMRuntime.getRuntime().is64Bit() ? "64" : ""; + if (!defaultSearchPaths.contains("/vendor/lib")) { + extraLibPaths.add("/vendor/lib" + abiSuffix); + } + if (!defaultSearchPaths.contains("/odm/lib")) { + extraLibPaths.add("/odm/lib" + abiSuffix); + } + if (!defaultSearchPaths.contains("/product/lib")) { + extraLibPaths.add("/product/lib" + abiSuffix); + } + if (!extraLibPaths.isEmpty()) { + StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); + try { + ApplicationLoaders.getDefault().addNative(mClassLoader, extraLibPaths); + } finally { + StrictMode.setThreadPolicy(oldPolicy); + } + } + if (addedPaths != null && addedPaths.size() > 0) { final String add = TextUtils.join(File.pathSeparator, addedPaths); ApplicationLoaders.getDefault().addPath(mClassLoader, add); |
