From 9a3ad5a4eca76e2d0c2771a20668e93865b6eb67 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 20 Feb 2014 12:56:29 +0100 Subject: [PATCH] Added minimal validation of parsed shares coming from server to avoid crashes due to bad formed or unexpected responses --- .../android/lib/utils/ShareXMLParser.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 161504ad..ca4934fd 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -221,7 +221,8 @@ public class ShareXMLParser { } String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { - shares.add(readElement(parser)); + readElement(parser, shares); + } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response share = new OCShare(); String value = readNode(parser, NODE_ID); @@ -244,7 +245,6 @@ public class ShareXMLParser { if (share != null) { shares.add(share); } - return shares; @@ -258,7 +258,7 @@ public class ShareXMLParser { * @throws XmlPullParserException * @throws IOException */ - private OCShare readElement(XmlPullParser parser) throws XmlPullParserException, IOException { + private void readElement(XmlPullParser parser, ArrayList shares) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); OCShare share = new OCShare(); @@ -272,7 +272,9 @@ public class ShareXMLParser { String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { - share = readElement(parser); + // patch to work around servers responding with extra surrounding all the shares on the same file before + // https://github.com/owncloud/core/issues/6992 was fixed + readElement(parser, shares); } else if (name.equalsIgnoreCase(NODE_ID)) { share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); @@ -329,7 +331,13 @@ public class ShareXMLParser { } } - return share; + if (isValidShare(share)) { + shares.add(share); + } + } + + private boolean isValidShare(OCShare share) { + return (share.getIdRemoteShared() > -1); } private void fixPathForFolder(OCShare share) {