Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbd968f4 authored by d34d's avatar d34d Committed by Clark Scheff
Browse files

Handle case where profiles.xml was partially saved

If profiles.xml is only partially written out to disk when the device
reboots, it's possible for the parsing to end up in an endless loop
since we are not checking for XmlPullParser.END_DOCUMENT events.  This
patch adds checks for those events and throws an IOException.

Change-Id: I417774dd67053e73ba9a5a418d914aad22fe3c24
(cherry picked from commit 959762d5)
parent 7e538816
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -101,7 +101,8 @@ public final class AirplaneModeSettings implements Parcelable {
            throws XmlPullParserException, IOException {
        int event = xpp.next();
        AirplaneModeSettings airplaneModeDescriptor = new AirplaneModeSettings();
        while (event != XmlPullParser.END_TAG || !xpp.getName().equals("airplaneModeDescriptor")) {
        while ((event != XmlPullParser.END_TAG && event != XmlPullParser.END_DOCUMENT) ||
                !xpp.getName().equals("airplaneModeDescriptor")) {
            if (event == XmlPullParser.START_TAG) {
                String name = xpp.getName();
                if (name.equals("value")) {
@@ -109,6 +110,8 @@ public final class AirplaneModeSettings implements Parcelable {
                } else if (name.equals("override")) {
                    airplaneModeDescriptor.mOverride = Boolean.parseBoolean(xpp.nextText());
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing airplane mode settings");
            }
            event = xpp.next();
        }
+2 −0
Original line number Diff line number Diff line
@@ -249,6 +249,8 @@ public final class ConnectionSettings implements Parcelable {
                } else if (name.equals("override")) {
                    connectionDescriptor.mOverride = Boolean.parseBoolean(xpp.nextText());
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing connection settings");
            }
            event = xpp.next();
        }
+4 −0
Original line number Diff line number Diff line
@@ -628,6 +628,8 @@ public final class Profile implements Parcelable, Comparable {
                if (trigger != null) {
                    profile.mTriggers.put(trigger.mId, trigger);
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing triggers");
            }
            event = xpp.next();
        }
@@ -720,6 +722,8 @@ public final class Profile implements Parcelable, Comparable {
                if (name.equals("triggers")) {
                    readTriggersFromXml(xpp, context, profile);
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing profle:" + profileName);
            }
            event = xpp.next();
        }
+2 −0
Original line number Diff line number Diff line
@@ -353,6 +353,8 @@ public final class ProfileGroup implements Parcelable {
                } else if (name.equals("lightsMode")) {
                    profileGroup.setLightsMode(Mode.valueOf(xpp.nextText()));
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing profleGroup:" + name);
            }
            event = xpp.next();
        }
+4 −1
Original line number Diff line number Diff line
@@ -103,7 +103,8 @@ public final class RingModeSettings implements Parcelable {
            throws XmlPullParserException, IOException {
        int event = xpp.next();
        RingModeSettings ringModeDescriptor = new RingModeSettings();
        while (event != XmlPullParser.END_TAG || !xpp.getName().equals("ringModeDescriptor")) {
        while ((event != XmlPullParser.END_TAG && event != XmlPullParser.END_DOCUMENT) ||
                !xpp.getName().equals("ringModeDescriptor")) {
            if (event == XmlPullParser.START_TAG) {
                String name = xpp.getName();
                if (name.equals("value")) {
@@ -111,6 +112,8 @@ public final class RingModeSettings implements Parcelable {
                } else if (name.equals("override")) {
                    ringModeDescriptor.mOverride = Boolean.parseBoolean(xpp.nextText());
                }
            } else if (event == XmlPullParser.END_DOCUMENT) {
                throw new IOException("Premature end of file while parsing ring mode settings");
            }
            event = xpp.next();
        }
Loading