Index: base/android/java/src/org/chromium/base/library_loader/Linker.java |
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
index 67e5f83ea8e9b62867942497ba0be07541376f2d..d58d1fc28e2d173e192e8c9d7a40398ba7c09c09 100644 |
--- a/base/android/java/src/org/chromium/base/library_loader/Linker.java |
+++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
@@ -798,6 +798,19 @@ public class Linker { |
} |
/** |
+ * Enable the fallback due to lack of support for mapping the APK file with |
+ * executable permission (see crbug.com/398425). |
+ */ |
+ public static void enableNoMapExecSupportFallback() { |
+ synchronized (Linker.class) { |
+ ensureInitializedLocked(); |
+ |
+ if (DEBUG) Log.i(TAG, "Enabling no map executable support fallback"); |
+ nativeEnableNoMapExecSupportFallback(); |
+ } |
+ } |
+ |
+ /** |
* Determine whether a library is the linker library. Also deal with the |
* component build that adds a .cr suffix to the name. |
*/ |
@@ -812,46 +825,50 @@ public class Linker { |
* @return the library path. |
*/ |
public static String getLibraryFilePathInZipFile(String library) throws FileNotFoundException { |
- String path = nativeGetLibraryFilePathInZipFile(library); |
- if (path.equals("")) { |
- throw new FileNotFoundException( |
- "Failed to retrieve path in zip file for library " + library); |
+ synchronized (Linker.class) { |
+ ensureInitializedLocked(); |
+ |
+ String path = nativeGetLibraryFilePathInZipFile(library); |
+ if (path.equals("")) { |
+ throw new FileNotFoundException( |
+ "Failed to retrieve path in zip file for library " + library); |
+ } |
+ return path; |
} |
- return path; |
} |
/** |
- * Check whether the device supports loading a library directly from the APK file. |
+ * Check whether the device supports mapping the APK file with executable permission. |
* |
* @param apkFile Filename of the APK. |
* @return true if supported. |
*/ |
- public static boolean checkLibraryLoadFromApkSupport(String apkFile) { |
+ public static boolean checkMapExecSupport(String apkFile) { |
assert apkFile != null; |
synchronized (Linker.class) { |
ensureInitializedLocked(); |
- if (DEBUG) Log.i(TAG, "checkLibraryLoadFromApkSupported: " + apkFile); |
- boolean supported = nativeCheckLibraryLoadFromApkSupport(apkFile); |
- if (DEBUG) Log.i(TAG, "Loading a library directly from the APK file " |
+ if (DEBUG) Log.i(TAG, "checkMapExecSupport: " + apkFile); |
+ boolean supported = nativeCheckMapExecSupport(apkFile); |
+ if (DEBUG) Log.i(TAG, "Mapping the APK file with executable permission " |
+ (supported ? "" : "NOT ") + "supported"); |
return supported; |
} |
} |
/** |
- * Check whether a library is page aligned in the APK file. |
+ * Check whether a library is page aligned and uncompressed in the APK file. |
* |
* @param apkFile Filename of the APK. |
* @param library The library's base name. |
- * @return true if page aligned. |
+ * @return true if page aligned and uncompressed. |
*/ |
- public static boolean checkLibraryAlignedInApk(String apkFile, String library) { |
+ public static boolean checkLibraryIsMappableInApk(String apkFile, String library) { |
synchronized (Linker.class) { |
ensureInitializedLocked(); |
- if (DEBUG) Log.i(TAG, "checkLibraryAlignedInApk: " + apkFile + ", " + library); |
- boolean aligned = nativeCheckLibraryAlignedInApk(apkFile, library); |
+ if (DEBUG) Log.i(TAG, "checkLibraryIsMappableInApk: " + apkFile + ", " + library); |
+ boolean aligned = nativeCheckLibraryIsMappableInApk(apkFile, library); |
if (DEBUG) Log.i(TAG, library + " is " + (aligned ? "" : "NOT ") |
+ "page aligned in " + apkFile); |
return aligned; |
@@ -909,6 +926,12 @@ public class Linker { |
LibInfo libInfo); |
/** |
+ * Native method used to enable the fallback due to lack of support for |
+ * mapping the APK file with executable permission. |
+ */ |
+ private static native void nativeEnableNoMapExecSupportFallback(); |
+ |
+ /** |
* Native method used to create a shared RELRO section. |
* If the library was already loaded at the same address using |
* nativeLoadLibrary(), this creates the RELRO for it. Otherwise, |
@@ -964,22 +987,23 @@ public class Linker { |
private static native String nativeGetLibraryFilePathInZipFile(String library); |
/** |
- * Native method which checks whether the device supports loading a library |
- * directly from the APK file. |
+ * Native method which checks whether the device supports mapping the APK file |
+ * with executable permission. |
* |
* @param apkFile Filename of the APK. |
* @return true if supported. |
*/ |
- private static native boolean nativeCheckLibraryLoadFromApkSupport(String apkFile); |
+ private static native boolean nativeCheckMapExecSupport(String apkFile); |
/** |
- * Native method which checks whether a library is page aligned in the APK file. |
+ * Native method which checks whether a library is page aligned and |
+ * uncompressed in the APK file. |
* |
* @param apkFile Filename of the APK. |
* @param library The library's base name. |
- * @return true if page aligned. |
+ * @return true if page aligned and uncompressed. |
*/ |
- private static native boolean nativeCheckLibraryAlignedInApk(String apkFile, String library); |
+ private static native boolean nativeCheckLibraryIsMappableInApk(String apkFile, String library); |
/** |
* Record information for a given library. |