Skip to content

Commit 7140266

Browse files
committed
[bugfix] Fix a stackoverflow error introduced to in-memory nodes in 7044baa
1 parent da30c4d commit 7140266

File tree

4 files changed

+108
-4
lines changed

4 files changed

+108
-4
lines changed

exist-core/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,7 @@
700700
<include>src/test/xquery/pi.xqm</include>
701701
<include>src/test/xquery/securitymanager/acl.xqm</include>
702702
<include>src/main/java/org/exist/dom/memtree/DocumentTypeImpl.java</include>
703+
<include>src/test/resources/org/exist/dom/memtree/simple.xhtml</include>
703704
<include>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java</include>
704705
<include>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java</include>
705706
<include>src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java</include>
@@ -1412,6 +1413,7 @@
14121413
<exclude>src/main/java/org/exist/dom/memtree/NamespaceNode.java</exclude>
14131414
<exclude>src/main/java/org/exist/dom/memtree/NodeImpl.java</exclude>
14141415
<exclude>src/main/java/org/exist/dom/memtree/ProcessingInstructionImpl.java</exclude>
1416+
<exclude>src/test/resources/org/exist/dom/memtree/simple.xhtml</exclude>
14151417
<exclude>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java</exclude>
14161418
<exclude>src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java</exclude>
14171419
<exclude>src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java</exclude>

exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,7 +1773,7 @@ public String lookupNamespaceURI(final String prefix) {
17731773
if (ns != -1) {
17741774
while (ns < nextNamespace && namespaceParent[ns] == nodeNumber) {
17751775
final QName nsQName = namespaceCode[ns];
1776-
if (prefix.equals(nsQName.getPrefix())) {
1776+
if (prefix.equals(nsQName.getPrefix()) || (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX) && nsQName.getPrefix() == null && XMLConstants.XMLNS_ATTRIBUTE.equals(nsQName.getLocalPart()))) {
17771777
return nsQName.getNamespaceURI();
17781778
}
17791779
++ns;
@@ -1787,7 +1787,7 @@ public String lookupNamespaceURI(final String prefix) {
17871787
while (parent > nodeNumber) {
17881788
parent = next[parent];
17891789
}
1790-
if (parent != -1) {
1790+
if (parent != -1 && !(nodeNumber == 0 && parent == 0)) {
17911791
return getInScopePrefix(prefix, parent);
17921792
}
17931793
}

exist-core/src/test/java/org/exist/dom/memtree/DocumentImplTest.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@
5555
import org.w3c.dom.*;
5656
import org.xml.sax.*;
5757

58+
import javax.annotation.Nullable;
5859
import javax.xml.XMLConstants;
5960
import javax.xml.parsers.*;
6061
import java.io.IOException;
6162
import java.io.InputStream;
6263

63-
import static org.junit.Assert.assertEquals;
64-
import static org.junit.Assert.assertTrue;
6564
import static java.nio.charset.StandardCharsets.UTF_8;
65+
import static org.junit.Assert.*;
6666

6767
/**
6868
* @author Adam Retter <[email protected]>
@@ -178,6 +178,34 @@ public void checkNamespaces_exist() throws IOException, SAXException, ParserConf
178178
assertEquals("http://exist-db.org/xquery/repo", attr2.getValue());
179179
}
180180

181+
@Test
182+
public void testGetInScopePrefix() throws IOException, ParserConfigurationException, SAXException {
183+
final MemTreeBuilder memtreeBuilder = new MemTreeBuilder();
184+
final DocumentBuilderReceiver documentBuilderReceiver = new DocumentBuilderReceiver(memtreeBuilder, true);
185+
186+
try (final InputStream is = getClass().getResourceAsStream("simple.xhtml")) {
187+
final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
188+
saxParserFactory.setNamespaceAware(true);
189+
final SAXParser saxParser = saxParserFactory.newSAXParser();
190+
final XMLReader xmlReader = saxParser.getXMLReader();
191+
xmlReader.setContentHandler(documentBuilderReceiver);
192+
193+
memtreeBuilder.startDocument();
194+
xmlReader.parse(new InputSource(is));
195+
memtreeBuilder.endDocument();
196+
}
197+
198+
final Document document = memtreeBuilder.getDocument();
199+
assertTrue(document instanceof DocumentImpl);
200+
final DocumentImpl documentImpl = (DocumentImpl) document;
201+
202+
final int lastNodeNumber = documentImpl.getLastNode();
203+
assertEquals(81, lastNodeNumber);
204+
205+
@Nullable final String namespaceUri = documentImpl.getInScopePrefix(XMLConstants.DEFAULT_NS_PREFIX, lastNodeNumber);
206+
assertEquals(Namespaces.XHTML_NS, namespaceUri);
207+
}
208+
181209
private Document parseXerces(final InputStream is) throws ParserConfigurationException, SAXException, IOException {
182210
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
183211
factory.setNamespaceAware(true);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+
<!--
3+
4+
Elemental
5+
Copyright (C) 2024, Evolved Binary Ltd
6+
7+
8+
https://www.evolvedbinary.com | https://www.elemental.xyz
9+
10+
This library is free software; you can redistribute it and/or
11+
modify it under the terms of the GNU Lesser General Public
12+
License as published by the Free Software Foundation; version 2.1.
13+
14+
This library is distributed in the hope that it will be useful,
15+
but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
Lesser General Public License for more details.
18+
19+
You should have received a copy of the GNU Lesser General Public
20+
License along with this library; if not, write to the Free Software
21+
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22+
23+
-->
24+
<body xmlns="http://www.w3.org/1999/xhtml">
25+
<header>
26+
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
27+
<div class="container-fluid">
28+
<a class="navbar-brand col-md-3 col-lg-2 me-0 px-3" href="index.html">
29+
<object class="logo-filtered" data="images/logo.svg" height="40" type="image/svg+xml" width="200"/>
30+
</a>
31+
<button aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-bs-target="#navbarCollapse" data-bs-toggle="collapse" type="button">
32+
<span class="navbar-toggler-icon"/>
33+
</button>
34+
<div class="collapse navbar-collapse" id="navbarCollapse">
35+
<ul class="navbar-nav me-auto mb-2 mb-md-0">
36+
<li class="nav-item">
37+
<a aria-current="page" class="nav-link active" href="index.html">Home</a>
38+
</li>
39+
<li class="nav-item">
40+
<a class="nav-link" href="#">About</a>
41+
</li>
42+
<li class="nav-item">
43+
<a class="nav-link" href="docs.html" target="_blank">Handbook</a>
44+
</li>
45+
</ul>
46+
<span class="d-flex" role="search">
47+
<span data-template="app:userinfo">
48+
<ul class="nav navbar-nav">
49+
<li>
50+
<p class="navbar-btn">
51+
<div class="dropdown">
52+
<button class="btn btn-sm btn btn-outline-light dropdown-toggle" data-bs-toggle="dropdown" type="button">
53+
<span class="glyphicon glyphicon-user"/>
54+
admin
55+
<span class="caret"/>
56+
</button>
57+
<ul class="dropdown-menu">
58+
<!--<li><a href="{$app:navbase}/user.html?user={$user}">Account</a></li>-->
59+
<li>
60+
<a href="admin?logout=true" id="logout">Logout</a>
61+
</li>
62+
</ul>
63+
</div>
64+
</p>
65+
</li>
66+
</ul>
67+
</span>
68+
</span>
69+
</div>
70+
</div>
71+
</nav>
72+
</header>
73+
<div class="container-fluid grayed"/>
74+
</body>

0 commit comments

Comments
 (0)