From 48e931659f811b31a5187c978422d398cc6bda2e Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Fri, 18 Aug 2017 11:00:19 -0700 Subject: [PATCH] Avoid potential reboot loop due to package cache Bug: 64295061 Test: Boot (write package cache) and reboot (read package cache) Change-Id: I5de712c9666bac71ff6121001163ebc90c4b62d0 --- .../android/content/pm/PackageParser.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 9b9499cd602d6..7ae85225ef1bc 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1120,12 +1120,12 @@ public class PackageParser { final String cacheKey = getCacheKey(packageFile, flags); final File cacheFile = new File(mCacheDir, cacheKey); - // If the cache is not up to date, return null. - if (!isCacheUpToDate(packageFile, cacheFile)) { - return null; - } - try { + // If the cache is not up to date, return null. + if (!isCacheUpToDate(packageFile, cacheFile)) { + return null; + } + final byte[] bytes = IoUtils.readFileAsByteArray(cacheFile.getAbsolutePath()); Package p = fromCacheEntry(bytes); if (mCallback != null) { @@ -1140,7 +1140,7 @@ public class PackageParser { } } return p; - } catch (Exception e) { + } catch (Throwable e) { Slog.w(TAG, "Error reading package cache: ", e); // If something went wrong while reading the cache entry, delete the cache file @@ -1158,26 +1158,30 @@ public class PackageParser { return; } - final String cacheKey = getCacheKey(packageFile, flags); - final File cacheFile = new File(mCacheDir, cacheKey); + try { + final String cacheKey = getCacheKey(packageFile, flags); + final File cacheFile = new File(mCacheDir, cacheKey); - if (cacheFile.exists()) { - if (!cacheFile.delete()) { - Slog.e(TAG, "Unable to delete cache file: " + cacheFile); + if (cacheFile.exists()) { + if (!cacheFile.delete()) { + Slog.e(TAG, "Unable to delete cache file: " + cacheFile); + } } - } - final byte[] cacheEntry = toCacheEntry(parsed); + final byte[] cacheEntry = toCacheEntry(parsed); - if (cacheEntry == null) { - return; - } + if (cacheEntry == null) { + return; + } - try (FileOutputStream fos = new FileOutputStream(cacheFile)) { - fos.write(cacheEntry); - } catch (IOException ioe) { - Slog.w(TAG, "Error writing cache entry.", ioe); - cacheFile.delete(); + try (FileOutputStream fos = new FileOutputStream(cacheFile)) { + fos.write(cacheEntry); + } catch (IOException ioe) { + Slog.w(TAG, "Error writing cache entry.", ioe); + cacheFile.delete(); + } + } catch (Throwable e) { + Slog.w(TAG, "Error saving package cache.", e); } }