[ http://issues.apache.org/jira/browse/XERCESJ-1203?page=comments#action_12441166 ] George Cristian Bina commented on XERCESJ-1203: -----------------------------------------------
Hi Michael, It should appear on a DTD like the one below when both http://apache.org/xml/features/validation/warn-on-undeclared-elemdef and http://apache.org/xml/features/validation/warn-on-duplicate-attdef are enabled: <?xml encoding="UTF-8"?> <!ELEMENT test (#PCDATA)> <!ATTLIST test a CDATA #IMPLIED> <!ATTLIST test a CDATA #IMPLIED> This was in one of our test cases and when we enabled the checking for undeclared elements on DTD validation the testcase failed and I noticed the NPE that can be fixed with the proposed patch. Thanks, George > NPE in XMLDTDProcessor > ---------------------- > > Key: XERCESJ-1203 > URL: http://issues.apache.org/jira/browse/XERCESJ-1203 > Project: Xerces2-J > Issue Type: Bug > Components: DTD > Affects Versions: 2.8.1 > Reporter: George Cristian Bina > > When checking for undeclared elements is enabled Xerces throws a NPE in > XMLDTDProcessor in private void checkDeclaredElements(DTDGrammar grammar, int > elementIndex, int contentSpecIndex, XMLContentSpec contentSpec). That's > because int[] contentSpec.otherValue can be null and the current code tries > to get the value at index 0. A possible fix is to access otherValue only when > we know it exists, change > else { > // It's not a leaf, so we have to recurse its left and maybe right > // nodes. Save both values before we recurse and trash the node. > final int leftNode = ((int[])contentSpec.value)[0]; > final int rightNode = ((int[])contentSpec.otherValue)[0]; > if ((contentSpec.type == XMLContentSpec.CONTENTSPECNODE_CHOICE) > || (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_SEQ)) { > // Recurse on both children. > checkDeclaredElements(grammar, elementIndex, leftNode, > contentSpec); > checkDeclaredElements(grammar, elementIndex, rightNode, > contentSpec); > } > else if (contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE > || contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ZERO_OR_ONE > || contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ONE_OR_MORE) { > checkDeclaredElements(grammar, elementIndex, leftNode, > contentSpec); > } > } > to > else { > // It's not a leaf, so we have to recurse its left and maybe right > // nodes. Save both values before we recurse and trash the node. > if ((contentSpec.type == XMLContentSpec.CONTENTSPECNODE_CHOICE) > || (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_SEQ)) { > // Recurse on both children. > final int leftNode = ((int[])contentSpec.value)[0]; > final int rightNode = ((int[])contentSpec.otherValue)[0]; > checkDeclaredElements(grammar, elementIndex, leftNode, > contentSpec); > checkDeclaredElements(grammar, elementIndex, rightNode, > contentSpec); > } > else if (contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE > || contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ZERO_OR_ONE > || contentSpec.type == > XMLContentSpec.CONTENTSPECNODE_ONE_OR_MORE) { > final int leftNode = ((int[])contentSpec.value)[0]; > checkDeclaredElements(grammar, elementIndex, leftNode, > contentSpec); > } > } > Thanks, > George -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
