diff options
| author | Svet Ganov <svetoslavganov@google.com> | 2015-03-27 17:55:08 -0700 |
|---|---|---|
| committer | Svet Ganov <svetoslavganov@google.com> | 2015-03-27 17:58:40 -0700 |
| commit | 8440ca3934dbb65743b357006e4a019e4351d479 (patch) | |
| tree | 3e36fb1beaeb0233d1c777b1db3b8e495e6245f0 /packages/SettingsProvider | |
| parent | 63fa14bdfb953f615ea013b27ccc7b3a42dc169e (diff) | |
| download | frameworks_base-8440ca3934dbb65743b357006e4a019e4351d479.zip frameworks_base-8440ca3934dbb65743b357006e4a019e4351d479.tar.gz frameworks_base-8440ca3934dbb65743b357006e4a019e4351d479.tar.bz2 | |
Relax the parsing code in settings provider.
The practice in the system server is to have lenient parsing code
to avoid the whole system being unusable due to a single XML error.
Change-Id: Idf44031edf5221966f3352ca2f83e284973ab95f
Diffstat (limited to 'packages/SettingsProvider')
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java | 90 |
1 files changed, 27 insertions, 63 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 3bf6828..d0f4e7d 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -416,78 +416,42 @@ final class SettingsState { private void parseStateLocked(XmlPullParser parser) throws IOException, XmlPullParserException { - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.START_TAG, TAG_SETTINGS); - - mVersion = Integer.parseInt(parser.getAttributeValue(null, ATTR_VERSION)); - - parser.next(); + final int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } - while (parseSettingLocked(parser)) { - parser.next(); + String tagName = parser.getName(); + if (tagName.equals(TAG_SETTINGS)) { + parseSettingsLocked(parser); + } } - - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_SETTINGS); } - private boolean parseSettingLocked(XmlPullParser parser) + private void parseSettingsLocked(XmlPullParser parser) throws IOException, XmlPullParserException { - skipEmptyTextTags(parser); - if (!accept(parser, XmlPullParser.START_TAG, TAG_SETTING)) { - return false; - } - - String id = parser.getAttributeValue(null, ATTR_ID); - String name = parser.getAttributeValue(null, ATTR_NAME); - String value = parser.getAttributeValue(null, ATTR_VALUE); - String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); - mSettings.put(name, new Setting(name, unpackValue(value), - unpackValue(packageName), id)); - - if (DEBUG_PERSISTENCE) { - Slog.i(LOG_TAG, "[RESTORED] " + name + "=" + value); - } - - parser.next(); - - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_SETTING); - - return true; - } - - private void expect(XmlPullParser parser, int type, String tag) - throws IOException, XmlPullParserException { - if (!accept(parser, type, tag)) { - throw new XmlPullParserException("Expected event: " + type - + " and tag: " + tag + " but got event: " + parser.getEventType() - + " and tag:" + parser.getName()); - } - } + final int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } - private void skipEmptyTextTags(XmlPullParser parser) - throws IOException, XmlPullParserException { - while (accept(parser, XmlPullParser.TEXT, null) - && parser.isWhitespace()) { - parser.next(); - } - } + String id = parser.getAttributeValue(null, ATTR_ID); + String name = parser.getAttributeValue(null, ATTR_NAME); + String value = parser.getAttributeValue(null, ATTR_VALUE); + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); + mSettings.put(name, new Setting(name, unpackValue(value), + unpackValue(packageName), id)); - private boolean accept(XmlPullParser parser, int type, String tag) - throws IOException, XmlPullParserException { - if (parser.getEventType() != type) { - return false; - } - if (tag != null) { - if (!tag.equals(parser.getName())) { - return false; + if (DEBUG_PERSISTENCE) { + Slog.i(LOG_TAG, "[RESTORED] " + name + "=" + value); } - } else if (parser.getName() != null) { - return false; } - return true; } private final class MyHandler extends Handler { |
