Created: (XERCESJ-1203) NPE in XMLDTDProcessor 2006-10-10 - By George Cristian Bina (JIRA)
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)
|
|