Author: jahewson Date: Wed Jul 15 19:37:17 2015 New Revision: 1691261 URL: http://svn.apache.org/r1691261 Log: PDFBOX-2885: Handle erroneous non-field objects in AcroForms
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java?rev=1691261&r1=1691260&r2=1691261&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroForm.java Wed Jul 15 19:37:17 2015 @@ -173,7 +173,10 @@ public final class PDAcroForm implements if (element != null) { PDField field = PDField.fromDictionary(this, element, null); - pdFields.add(field); + if (field != null) + { + pdFields.add(field); + } } } return new COSArrayList<PDField>(pdFields, cosFields); @@ -256,23 +259,25 @@ public final class PDAcroForm implements fieldName.getString().equals(nameSubSection[0])) { PDField root = PDField.fromDictionary(this, element, null); - - if (nameSubSection.length > 1) + if (root != null) { - PDField kid = root.findKid(nameSubSection, 1); - if (kid != null) + if (nameSubSection.length > 1) { - retval = kid; + PDField kid = root.findKid(nameSubSection, 1); + if (kid != null) + { + retval = kid; + } + else + { + retval = root; + } } else { retval = root; } } - else - { - retval = root; - } } } } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java?rev=1691261&r1=1691260&r2=1691261&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java Wed Jul 15 19:37:17 2015 @@ -289,7 +289,7 @@ public abstract class PDField implements { retval = PDField.fromDictionary(acroForm, kidDictionary, (PDNonTerminalField)this); - if (name.length > nameIndex + 1) + if (retval != null && name.length > nameIndex + 1) { retval = retval.findKid(name, nameIndex + 1); } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java?rev=1691261&r1=1691260&r2=1691261&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldFactory.java Wed Jul 15 19:37:17 2015 @@ -61,10 +61,15 @@ final class PDFieldFactory { return createButtonSubType(form, field, parent); } - else + else if (field.containsKey(COSName.KIDS)) { return new PDNonTerminalField(form, field, parent); } + else + { + // an erroneous non-field object, see PDFBOX-2885 + return null; + } } private static PDField createChoiceSubType(PDAcroForm form, COSDictionary field, Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java?rev=1691261&r1=1691260&r2=1691261&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java Wed Jul 15 19:37:17 2015 @@ -130,7 +130,10 @@ public class PDNonTerminalField extends for (int i = 0; i < kids.size(); i++) { PDField field = PDField.fromDictionary(acroForm, (COSDictionary)kids.getObject(i), this); - children.add(field); + if (field != null) + { + children.add(field); + } } return children; }