diff --git a/src/ooxml/java/org/apache/poi/ooxml/util/SAXHelper.java b/src/ooxml/java/org/apache/poi/ooxml/util/SAXHelper.java index 2ebd9f8141..c954b46ca1 100644 --- a/src/ooxml/java/org/apache/poi/ooxml/util/SAXHelper.java +++ b/src/ooxml/java/org/apache/poi/ooxml/util/SAXHelper.java @@ -46,7 +46,7 @@ public final class SAXHelper { /** * Creates a new SAX XMLReader, with sensible defaults */ - public static synchronized XMLReader newXMLReader() throws SAXException, ParserConfigurationException { + public static XMLReader newXMLReader() throws SAXException, ParserConfigurationException { XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); xmlReader.setEntityResolver(IGNORING_ENTITY_RESOLVER); trySetSAXFeature(xmlReader, XMLConstants.FEATURE_SECURE_PROCESSING); diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/util/TestDocumentHelper.java b/src/ooxml/testcases/org/apache/poi/ooxml/util/TestDocumentHelper.java index 9ffb78627a..eb8d28ba72 100644 --- a/src/ooxml/testcases/org/apache/poi/ooxml/util/TestDocumentHelper.java +++ b/src/ooxml/testcases/org/apache/poi/ooxml/util/TestDocumentHelper.java @@ -18,11 +18,13 @@ package org.apache.poi.ooxml.util; import org.junit.Test; import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import java.io.ByteArrayInputStream; import java.util.ArrayList; +import java.util.HashSet; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -47,10 +49,13 @@ public class TestDocumentHelper { return DocumentHelper.newDocumentBuilder(); })); } + HashSet dbs = new HashSet<>(); for(CompletableFuture future : futures) { DocumentBuilder documentBuilder = future.get(10, TimeUnit.SECONDS); assertTrue(documentBuilder.isNamespaceAware()); + dbs.add(documentBuilder); } + assertEquals(limit, dbs.size()); } @Test diff --git a/src/ooxml/testcases/org/apache/poi/ooxml/util/TestSAXHelper.java b/src/ooxml/testcases/org/apache/poi/ooxml/util/TestSAXHelper.java index 1036a68f01..4087f25157 100644 --- a/src/ooxml/testcases/org/apache/poi/ooxml/util/TestSAXHelper.java +++ b/src/ooxml/testcases/org/apache/poi/ooxml/util/TestSAXHelper.java @@ -19,8 +19,13 @@ package org.apache.poi.ooxml.util; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; import org.junit.Test; import org.xml.sax.InputSource; @@ -46,4 +51,28 @@ public class TestSAXHelper { } reader.parse(new InputSource(new ByteArrayInputStream("".getBytes("UTF-8")))); } + + @Test + public void testCreatingManyXMLReaders() throws Exception { + int limit = 1000; + ArrayList> futures = new ArrayList<>(); + for(int i = 0; i < limit; i++) { + futures.add(CompletableFuture.supplyAsync(() -> { + try { + return SAXHelper.newXMLReader(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + })); + } + HashSet readers = new HashSet<>(); + for(CompletableFuture future : futures) { + XMLReader reader = future.get(10, TimeUnit.SECONDS); + assertTrue(reader.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING)); + readers.add(reader); + } + assertEquals(limit, readers.size()); + } }