JDK-8133924 : NPE may be thrown when xsltc select a non-existing node after JDK-8062518
  • Type: Bug
  • Component: xml
  • Sub-Component: jaxp
  • Affected Version: 9
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2015-08-19
  • Updated: 2016-04-27
  • Resolved: 2015-08-26
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6 JDK 7 JDK 8 JDK 9
6u115Fixed 7u101Fixed 8u101Fixed 9 b80Fixed
Related Reports
Relates :  
Description
After JDK-8062518, the following test code will throw NPE.

TestTrans.java
import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class TestTrans {
    public static void main(String[] args) throws Exception {
        Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("librarySet01.xsl")));

        transformer.transform(new StreamSource(new File("librarySet01.xml")), new StreamResult("test1.out"));
    }
}


librarySet01.xsl :
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:set="http://exslt.org/sets"
    exclude-result-prefixes="set">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />

<xsl:template match="/">
  <out>
    <test desc="the second should be empty, but not null">
      <xsl:copy-of select="set:leading(/doc/*, /doc/non-existing)"/>
    </test>
  </out>
</xsl:template>

</xsl:stylesheet>


librarySet01.xml:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <num>1</num>
  <str>a</str>
  <num>2</num>
</doc>


Program output:
java TestTrans
ERROR:  ''
Exception in thread "main" javax.xml.transform.TransformerException: java.lang.NullPointerException
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:754)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:359)
	at TestTrans.main(TestTrans.java:16)
Caused by: java.lang.NullPointerException
	at com.sun.org.apache.xalan.internal.lib.ExsltSets.leading(ExsltSets.java:63)
	at librarySet01.template$dot$0()
	at librarySet01.applyTemplates()
	at librarySet01.transform()
	at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:619)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:747)
	... 2 more
---------
java.lang.NullPointerException
	at com.sun.org.apache.xalan.internal.lib.ExsltSets.leading(ExsltSets.java:63)
	at librarySet01.template$dot$0()
	at librarySet01.applyTemplates()
	at librarySet01.transform()
	at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:619)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:747)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:359)
	at TestTrans.main(TestTrans.java:16)


In XSL, select /doc/non-existing shoud returns an empty nodelist instance, but returns null actually, that causes NPE.
Comments
http://cr.openjdk.java.net/~fyuan/8133924/webrev.00/
25-08-2015

I see. In that case, you may also simply call return new DTMAxisIterNodeList(null, null); to create an empty NodeList, right? Could you put together a fix? Thanks.
20-08-2015

I believe the attached test.diff can fix this issue. However, interface com.sun.org.apache.xalan.internal.xsltc.DOM doesn't state the particular definition of makeNodeList, e.g. may this method return null or not. In com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl, makeNodeList(int index) may return null, but makeNodeList(DTMAxisIterator iter) will never return null, this represent the inconsistence of the design.
19-08-2015