From 27cb0d22a839f9fc132ae6b4e7c059c75a1826e1 Mon Sep 17 00:00:00 2001 From: "Torne (Richard Coles)" Date: Fri, 8 Aug 2014 18:24:12 +0100 Subject: Make WebViewFactory more robust. Catch and discard any exception thrown in getWebViewNativeLibraryPaths to avoid the system server crashing if there is something wrong with the update APK. prepareWebViewInSystemServer(nativePaths) is safe to call even if nativePaths is null or invalid, and must be called to ensure that any process waiting for relro processing is unblocked. Bug: 16894062 Change-Id: I76c759bebcb7c4643fb50979376afea764c859c4 --- core/java/android/webkit/WebViewFactory.java | 56 +++++++++++++++------------- 1 file changed, 30 insertions(+), 26 deletions(-) (limited to 'core/java') diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index d93ca2c..23894ee 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -175,7 +175,9 @@ public final class WebViewFactory { String[] nativePaths = null; try { nativePaths = getWebViewNativeLibraryPaths(); - } catch (PackageManager.NameNotFoundException e) { + } catch (Throwable t) { + // Log and discard errors at this stage as we must not crash the system server. + Log.e(LOGTAG, "error preparing webview native library", t); } prepareWebViewInSystemServer(nativePaths); } @@ -201,35 +203,37 @@ public final class WebViewFactory { String[] nativeLibs = null; try { nativeLibs = WebViewFactory.getWebViewNativeLibraryPaths(); - } catch (PackageManager.NameNotFoundException e) { - } - - if (nativeLibs != null) { - long newVmSize = 0L; - - for (String path : nativeLibs) { - if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path); - if (path == null) continue; - File f = new File(path); - if (f.exists()) { - long length = f.length(); - if (length > newVmSize) { - newVmSize = length; + if (nativeLibs != null) { + long newVmSize = 0L; + + for (String path : nativeLibs) { + if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path); + if (path == null) continue; + File f = new File(path); + if (f.exists()) { + long length = f.length(); + if (length > newVmSize) { + newVmSize = length; + } } } - } - if (DEBUG) { - Log.v(LOGTAG, "Based on library size, need " + newVmSize + - " bytes of address space."); + if (DEBUG) { + Log.v(LOGTAG, "Based on library size, need " + newVmSize + + " bytes of address space."); + } + // The required memory can be larger than the file on disk (due to .bss), and an + // upgraded version of the library will likely be larger, so always attempt to + // reserve twice as much as we think to allow for the library to grow during this + // boot cycle. + newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES); + Log.d(LOGTAG, "Setting new address space to " + newVmSize); + SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY, + Long.toString(newVmSize)); } - // The required memory can be larger than the file on disk (due to .bss), and an - // upgraded version of the library will likely be larger, so always attempt to reserve - // twice as much as we think to allow for the library to grow during this boot cycle. - newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES); - Log.d(LOGTAG, "Setting new address space to " + newVmSize); - SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY, - Long.toString(newVmSize)); + } catch (Throwable t) { + // Log and discard errors at this stage as we must not crash the system server. + Log.e(LOGTAG, "error preparing webview native library", t); } prepareWebViewInSystemServer(nativeLibs); } -- cgit v1.1