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]