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 "George Cristian Bina (JIRA)" <xe...@xml.apache.org> on 2006/10/10 15:48:19 UTC

[jira] Created: (XERCESJ-1203) NPE in XMLDTDProcessor

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@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org


[jira] Assigned: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]

Michael Glavassevich reassigned XERCESJ-1203:
---------------------------------------------

    Assignee: Michael Glavassevich

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


[jira] Closed: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]

Michael Glavassevich closed XERCESJ-1203.
-----------------------------------------


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


[jira] Reopened: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]

Michael Glavassevich reopened XERCESJ-1203:
-------------------------------------------

             

> 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


[jira] Resolved: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]

Michael Glavassevich resolved XERCESJ-1203.
-------------------------------------------

    Resolution: Fixed

George, I've just applied your suggested fix to SVN. Can you please verify that this works for you now? Thanks.

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


[jira] Closed: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ 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


[jira] Commented: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "George Cristian Bina (JIRA)" <xe...@xml.apache.org>.
    [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=comments#action_12441361 ] 
            
George Cristian Bina commented on XERCESJ-1203:
-----------------------------------------------

Thanks Michael also for the additional info. I verified the changes and there is no NPE now. Regards, 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
>         Assigned To: Michael Glavassevich
>
> 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


[jira] Commented: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "George Cristian Bina (JIRA)" <xe...@xml.apache.org>.
    [ 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@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org


[jira] Commented: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
    [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=comments#action_12441148 ] 
            
Michael Glavassevich commented on XERCESJ-1203:
-----------------------------------------------

Hi George, do you happen to have a test case which causes the NPE to be thrown?

> 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@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org


[jira] Commented: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
    [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=comments#action_12441335 ] 
            
Michael Glavassevich commented on XERCESJ-1203:
-----------------------------------------------

FYI: For the specific test you provided both contentSpec.value and contentSpec.otherValue are null. This is what you get for mixed content. We weren't accounting for that.

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


[jira] Updated: (XERCESJ-1203) NPE in XMLDTDProcessor

Posted by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org>.
     [ http://issues.apache.org/jira/browse/XERCESJ-1203?page=all ]

Michael Glavassevich updated XERCESJ-1203:
------------------------------------------

    Fix Version/s: 2.9.0

> 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