summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-01-06 11:31:35 +0000
committerNarayan Kamath <narayan@google.com>2014-01-06 11:31:35 +0000
commit2ac3cb7aef7c8a51cbeb6d34b648dedcb4363994 (patch)
tree75fe6aeb98b9b1d5b0cfe43137083feffb4a76e9
parentcccf2a333793badbcea9b04fe3f29447496a56d9 (diff)
downloadframeworks_base-2ac3cb7aef7c8a51cbeb6d34b648dedcb4363994.zip
frameworks_base-2ac3cb7aef7c8a51cbeb6d34b648dedcb4363994.tar.gz
frameworks_base-2ac3cb7aef7c8a51cbeb6d34b648dedcb4363994.tar.bz2
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
-rw-r--r--services/java/com/android/server/am/CompatModePackages.java7
-rw-r--r--services/java/com/android/server/am/UsageStatsService.java7
-rw-r--r--services/java/com/android/server/content/SyncStorageEngine.java8
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 59e6787..4d5577b 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 e96d8b1..09cb344 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 5ebf9ea..124bc60 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);