diff options
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 12 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/LegacyAppOpStateParser.java | 31 |
2 files changed, 24 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 7cf70613f07a..b4cce7da4416 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -5071,17 +5071,7 @@ public class AppOpsService extends IAppOpsService.Stub { } success = true; - } catch (IllegalStateException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (NullPointerException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (NumberFormatException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (XmlPullParserException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (IOException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (IndexOutOfBoundsException e) { + } catch (Exception e) { Slog.w(TAG, "Failed parsing " + e); } finally { if (!success) { diff --git a/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java b/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java index 9ed3a99013ea..b677a1dfc84b 100644 --- a/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java +++ b/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java @@ -50,6 +50,10 @@ class LegacyAppOpStateParser { public int readState(AtomicFile file, SparseArray<SparseIntArray> uidModes, SparseArray<ArrayMap<String, SparseIntArray>> userPackageModes) { try (FileInputStream stream = file.openRead()) { + SparseArray<SparseIntArray> parsedUidModes = new SparseArray<>(); + SparseArray<ArrayMap<String, SparseIntArray>> parsedUserPackageModes = + new SparseArray<>(); + TypedXmlPullParser parser = Xml.resolvePullParser(stream); int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -75,26 +79,37 @@ class LegacyAppOpStateParser { // version 2 has the structure pkg -> uid -> op -> // in version 3, since pkg and uid states are kept completely // independent we switch to user -> pkg -> op - readPackage(parser, userPackageModes); + readPackage(parser, parsedUserPackageModes); } else if (tagName.equals("uid")) { - readUidOps(parser, uidModes); + readUidOps(parser, parsedUidModes); } else if (tagName.equals("user")) { - readUser(parser, userPackageModes); + readUser(parser, parsedUserPackageModes); } else { Slog.w(TAG, "Unknown element under <app-ops>: " + parser.getName()); XmlUtils.skipCurrentTag(parser); } } + + // Parsing is complete, copy all parsed values to output + final int parsedUidModesSize = parsedUidModes.size(); + for (int i = 0; i < parsedUidModesSize; i++) { + uidModes.put(parsedUidModes.keyAt(i), parsedUidModes.valueAt(i)); + } + final int parsedUserPackageModesSize = parsedUserPackageModes.size(); + for (int i = 0; i < parsedUserPackageModesSize; i++) { + userPackageModes.put(parsedUserPackageModes.keyAt(i), + parsedUserPackageModes.valueAt(i)); + } + return versionAtBoot; } catch (FileNotFoundException e) { Slog.i(TAG, "No existing app ops " + file.getBaseFile() + "; starting empty"); - return NO_FILE_VERSION; - } catch (XmlPullParserException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); + } catch (Exception e) { + // All exceptions must be caught, otherwise device will not be able to boot + Slog.wtf(TAG, "Failed parsing " + e); } + return NO_FILE_VERSION; } private void readPackage(TypedXmlPullParser parser, |