You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org> on 2006/11/20 23:28:02 UTC
[jira] Closed: (XERCESJ-1203) NPE in XMLDTDProcessor
[ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]
Michael Glavassevich closed XERCESJ-1203.
-----------------------------------------
Resolution: Fixed
> 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
> Assigned To: Michael Glavassevich
> Fix For: 2.9.0
>
>
> 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@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org