From 2b644b2bff89277b3651e866326b862b62a80130 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 09:25:08 -0400 Subject: [PATCH] Xpp3Dom.removeChild(int): fix childMap corruption with duplicate names --- .../apache/maven/shared/utils/xml/Xpp3Dom.java | 16 +++++++++++++++- .../maven/shared/utils/xml/pull/Xpp3DomTest.java | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java index e76c6b95..3c933aca 100644 --- a/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java +++ b/src/main/java/org/apache/maven/shared/utils/xml/Xpp3Dom.java @@ -261,8 +261,22 @@ public int getChildCount() { */ public void removeChild(int i) { Xpp3Dom child = childList.remove(i); - childMap.values().remove(child); child.setParent(null); + + String name = child.getName(); + if (childMap.get(name) == child) { + Xpp3Dom lastWithName = null; + for (Xpp3Dom c : childList) { + if (name.equals(c.getName())) { + lastWithName = c; + } + } + if (lastWithName != null) { + childMap.put(name, lastWithName); + } else { + childMap.remove(name); + } + } } /** diff --git a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java index d64e9c49..b2cb9e1f 100644 --- a/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java +++ b/src/test/java/org/apache/maven/shared/utils/xml/pull/Xpp3DomTest.java @@ -42,6 +42,22 @@ private Xpp3Dom createElement(String element, String value) { return t1s1; } + @Test + public void removeChildByIndexUpdatesChildMap() { + Xpp3Dom parent = new Xpp3Dom("parent"); + Xpp3Dom first = new Xpp3Dom("child"); + first.setValue("first"); + Xpp3Dom second = new Xpp3Dom("child"); + second.setValue("second"); + parent.addChild(first); + parent.addChild(second); + + parent.removeChild(1); + + assertEquals(1, parent.getChildCount()); + assertEquals("first", parent.getChild("child").getValue()); + } + @Test public void mergePrecedenceSelfClosed() throws XmlPullParserException { Xpp3Dom parentConfig = build("");