[ 
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]

Reply via email to