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]

Reply via email to