From 2ac3cb7aef7c8a51cbeb6d34b648dedcb4363994 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Mon, 6 Jan 2014 11:31:35 +0000 Subject: [PATCH] Fix broken XML parsing idiom. Code that expected a single top level element in an XML file was doing something like : while (type != START_TAG) { next(); } This would loop forever when the XML being parsed was empty, where each call to XmlPullParser.next() would return END_DOCUMENT. bug: https://code.google.com/p/android/issues/detail?id=64173 Change-Id: I7543203e976a8999ae471a6c2d629249a87011bb --- .../java/com/android/server/am/CompatModePackages.java | 7 ++++++- .../java/com/android/server/am/UsageStatsService.java | 7 ++++++- .../com/android/server/content/SyncStorageEngine.java | 8 +++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/services/java/com/android/server/am/CompatModePackages.java b/services/java/com/android/server/am/CompatModePackages.java index 59e678738444f..4d5577bdbd69d 100644 --- a/services/java/com/android/server/am/CompatModePackages.java +++ b/services/java/com/android/server/am/CompatModePackages.java @@ -64,9 +64,14 @@ public final class CompatModePackages { XmlPullParser parser = Xml.newPullParser(); parser.setInput(fis, null); int eventType = parser.getEventType(); - while (eventType != XmlPullParser.START_TAG) { + while (eventType != XmlPullParser.START_TAG && + eventType != XmlPullParser.END_DOCUMENT) { eventType = parser.next(); } + if (eventType == XmlPullParser.END_DOCUMENT) { + return; + } + String tagName = parser.getName(); if ("compat-packages".equals(tagName)) { eventType = parser.next(); diff --git a/services/java/com/android/server/am/UsageStatsService.java b/services/java/com/android/server/am/UsageStatsService.java index e96d8b1ce91c8..09cb344531c36 100644 --- a/services/java/com/android/server/am/UsageStatsService.java +++ b/services/java/com/android/server/am/UsageStatsService.java @@ -396,9 +396,14 @@ public final class UsageStatsService extends IUsageStats.Stub { XmlPullParser parser = Xml.newPullParser(); parser.setInput(fis, null); int eventType = parser.getEventType(); - while (eventType != XmlPullParser.START_TAG) { + while (eventType != XmlPullParser.START_TAG && + eventType != XmlPullParser.END_DOCUMENT) { eventType = parser.next(); } + if (eventType == XmlPullParser.END_DOCUMENT) { + return; + } + String tagName = parser.getName(); if ("usage-history".equals(tagName)) { String pkg = null; diff --git a/services/java/com/android/server/content/SyncStorageEngine.java b/services/java/com/android/server/content/SyncStorageEngine.java index 5ebf9ea9ba5ea..124bc60df10c7 100644 --- a/services/java/com/android/server/content/SyncStorageEngine.java +++ b/services/java/com/android/server/content/SyncStorageEngine.java @@ -1697,9 +1697,15 @@ public class SyncStorageEngine extends Handler { XmlPullParser parser = Xml.newPullParser(); parser.setInput(fis, null); int eventType = parser.getEventType(); - while (eventType != XmlPullParser.START_TAG) { + while (eventType != XmlPullParser.START_TAG && + eventType != XmlPullParser.END_DOCUMENT) { eventType = parser.next(); } + if (eventType == XmlPullParser.END_DOCUMENT) { + Log.i(TAG, "No initial accounts"); + return; + } + String tagName = parser.getName(); if ("accounts".equals(tagName)) { String listen = parser.getAttributeValue(null, XML_ATTR_LISTEN_FOR_TICKLES);