Commented: (XERCESJ-1203) NPE in XMLDTDProcessor 2006-10-10 - By George Cristian Bina (JIRA)
[ 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: j-dev-unsubscribe@(protected) For additional commands, e-mail: j-dev-help@(protected)
|
|