Skip to content

Xpp3DomBuilder.createXmlReader: remove thread-unsafe system property manipulation - #393

Open
elharo wants to merge 3 commits into
masterfrom
fix/xpp3dombuilder-system-property
Open

Xpp3DomBuilder.createXmlReader: remove thread-unsafe system property manipulation#393
elharo wants to merge 3 commits into
masterfrom
fix/xpp3dombuilder-system-property

Conversation

@elharo

@elharo elharo commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Xpp3DomBuilder.createXmlReader() clears and restores the global org.xml.sax.driver system property without synchronization (lines 119-129). In a multi-threaded environment like Maven parallel builds, one thread's clear/restore sequence interferes with other threads' reads of the same property. The code's own comment acknowledges: "There's a 'slight' problem with this an parallel maven: It does not work ;)"

The method already tries to directly instantiate com.sun.org.apache.xerces.internal.parsers.SAXParser first — which succeeds on all Oracle/OpenJDK JVMs. The system property manipulation fallback is both unnecessary and harmful.

Fix: Removed the system property manipulation entirely. If the direct instantiation fails, falls through to XMLReaderFactory.createXMLReader() without modifying any global state.

Fixes #392

@elharo
elharo requested a review from slachiewicz July 1, 2026 14:07
@slachiewicz slachiewicz added the bug Something isn't working label Jul 2, 2026
@slachiewicz
slachiewicz removed their request for review July 2, 2026 06:06
@elharo
elharo requested a review from Copilot July 24, 2026 10:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes thread-unsafe manipulation of the global org.xml.sax.driver system property from Xpp3DomBuilder.createXmlReader(), addressing a race condition in multi-threaded environments (e.g., Maven parallel builds) as described in issue #392.

Changes:

  • Removed clear/restore of org.xml.sax.driver from createXmlReader() and now directly falls back to XMLReaderFactory.createXMLReader().
  • Added a regression test asserting that Xpp3DomBuilder.build(...) does not modify org.xml.sax.driver.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/main/java/org/apache/maven/shared/utils/xml/Xpp3DomBuilder.java Removes thread-unsafe global system property manipulation when creating an XMLReader.
src/test/java/org/apache/maven/shared/utils/xml/Xpp3DomBuilderTest.java Adds a regression test to ensure build() does not change the SAX driver system property.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +82 to +88
@Test
public void buildDoesNotModifySaxDriverProperty() {
String key = "org.xml.sax.driver";
String original = System.getProperty(key);
Xpp3DomBuilder.build(new StringReader("<root/>"));
assertEquals(original, System.getProperty(key));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Xpp3DomBuilder.createXmlReader() system property race condition

3 participants