svn commit: r1936806 - in apr/apr/trunk: . test test/data xml
[email protected] Mon, 03 Aug 2026 12:12:58 -0000
| Newsgroups | gmane.comp.apache.apr.cvs |
|---|---|
| Message-ID | <178575917868.1823555.11922547844630546281@svn03-he-fi> |
Author: covener
Date: Mon Aug 3 12:12:58 2026
New Revision: 1936806
Log:
limit XML processing depth
Submitted By: jorton
Reviewed By: jorton, jfclere, ivan
Added:
apr/apr/trunk/test/data/nesting.xml
Modified:
apr/apr/trunk/CMakeLists.txt
apr/apr/trunk/test/testxml.c
apr/apr/trunk/xml/apr_xml.c
apr/apr/trunk/xml/apr_xml_internal.h
apr/apr/trunk/xml/apr_xml_xmllite.c
Modified: apr/apr/trunk/CMakeLists.txt
==============================================================================
--- apr/apr/trunk/CMakeLists.txt Mon Aug 3 12:10:13 2026 (r1936805)
+++ apr/apr/trunk/CMakeLists.txt Mon Aug 3 12:12:58 2026 (r1936806)
@@ -628,6 +628,7 @@ if(APR_BUILD_TESTAPR)
# copy data files to build directory so that we can run programs from there
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/data)
file(COPY ${PROJECT_SOURCE_DIR}/test/data/billion-laughs.xml
+ ${PROJECT_SOURCE_DIR}/test/data/nesting.xml
${PROJECT_SOURCE_DIR}/test/data/file_datafile.txt
${PROJECT_SOURCE_DIR}/test/data/mmap_datafile.txt
${PROJECT_SOURCE_DIR}/test/data/mmap_large_datafile.txt
Added: apr/apr/trunk/test/data/nesting.xml
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ apr/apr/trunk/test/data/nesting.xml Mon Aug 3 12:12:58 2026 (r1936806)
@@ -0,0 +1,2001 @@
+<?xml version="1.0"?>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+<n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
+</n>
Modified: apr/apr/trunk/test/testxml.c
==============================================================================
--- apr/apr/trunk/test/testxml.c Mon Aug 3 12:10:13 2026 (r1936805)
+++ apr/apr/trunk/test/testxml.c Mon Aug 3 12:12:58 2026 (r1936806)
@@ -20,6 +20,10 @@
#include "abts.h"
#include "testutil.h"
+#ifndef APR_XML_MAX_DEPTH
+#define APR_XML_MAX_DEPTH 256
+#endif
+
static apr_status_t create_dummy_file_error(abts_case *tc, apr_pool_t *p,
apr_file_t **fd)
{
@@ -165,6 +169,33 @@ static void test_billion_laughs(abts_cas
apr_file_close(fd);
}
+static void test_nesting_limit(abts_case *tc, void *data)
+{
+ apr_file_t *fd;
+ apr_xml_parser *parser = NULL;
+ apr_xml_doc *doc;
+ apr_status_t rv;
+ char errbuf[256], *err;
+
+ rv = apr_file_open(&fd, "data/nesting.xml",
+ APR_FOPEN_READ, 0, p);
+ APR_ASSERT_SUCCESS(tc, "open nesting.xml", rv);
+
+ rv = apr_xml_parse_file(p, &parser, &doc, fd, 2000);
+ ABTS_TRUE(tc, rv != APR_SUCCESS);
+
+ if (parser) {
+ err = apr_xml_parser_geterror(parser, errbuf, sizeof errbuf);
+ ABTS_STR_EQUAL(tc,
+ "The maximum element nesting limit "
+ "(" APR_STRINGIFY(APR_XML_MAX_DEPTH) ")"
+ " was exceeded.",
+ err);
+ }
+
+ apr_file_close(fd);
+}
+
static void roundtrip(abts_case* tc, char* xml, char* expected, int lineno)
{
apr_xml_parser *parser;
@@ -330,6 +361,7 @@ abts_suite *testxml(abts_suite *suite)
abts_run_test(suite, test_xml_parser, NULL);
abts_run_test(suite, test_billion_laughs, NULL);
+ abts_run_test(suite, test_nesting_limit, NULL);
abts_run_test(suite, test_xml_roundtrip, NULL);
abts_run_test(suite, test_xml_parser_geterror, NULL);
Modified: apr/apr/trunk/xml/apr_xml.c
==============================================================================
--- apr/apr/trunk/xml/apr_xml.c Mon Aug 3 12:10:13 2026 (r1936805)
+++ apr/apr/trunk/xml/apr_xml.c Mon Aug 3 12:12:58 2026 (r1936806)
@@ -44,6 +44,10 @@ static const char APR_KW_xmlns_lang[] =
(name[2] == 0x4C || name[2] == 0x6C) )
+#ifndef APR_XML_MAX_DEPTH
+#define APR_XML_MAX_DEPTH 256
+#endif
+
/* struct for scoping namespace declarations */
typedef struct apr_xml_ns_scope {
const char *prefix; /* prefix used for this ns */
@@ -130,6 +134,11 @@ static void start_handler(void *userdata
if (parser->error)
return;
+ if (++parser->depth > APR_XML_MAX_DEPTH) {
+ parser->error = APR_XML_ERROR_DEPTH_LIMIT;
+ return;
+ }
+
elem = apr_pcalloc(parser->p, sizeof(*elem));
/* prep the element */
@@ -303,6 +312,8 @@ static void end_handler(void *userdata,
if (parser->error)
return;
+ parser->depth--;
+
/* pop up one level */
parser->cur_elem = parser->cur_elem->parent;
}
@@ -390,6 +401,11 @@ APR_DECLARE(char *) apr_xml_parser_geter
parser->xp_msg, parser->xp_err);
return errbuf;
+ case APR_XML_ERROR_DEPTH_LIMIT:
+ msg = "The maximum element nesting limit ("
+ APR_STRINGIFY(APR_XML_MAX_DEPTH) ") was exceeded.";
+ break;
+
case APR_XML_ERROR_PARSE_DONE:
msg = "The parser is not active.";
break;
Modified: apr/apr/trunk/xml/apr_xml_internal.h
==============================================================================
--- apr/apr/trunk/xml/apr_xml_internal.h Mon Aug 3 12:10:13 2026 (r1936805)
+++ apr/apr/trunk/xml/apr_xml_internal.h Mon Aug 3 12:12:58 2026 (r1936806)
@@ -40,8 +40,11 @@ struct apr_xml_parser {
int error;
#define APR_XML_ERROR_EXPAT 1
#define APR_XML_ERROR_PARSE_DONE 2
-/* also: public APR_XML_NS_ERROR_* values (if any) */
+#define APR_XML_ERROR_DEPTH_LIMIT 3
+/* also: public APR_XML_NS_ERROR_* values (if any) */
+ /** depth of element tree. */
+ unsigned int depth;
/** the actual (Expat) XML parser */
XML_Parser xp;
/** stored Expat error code */
Modified: apr/apr/trunk/xml/apr_xml_xmllite.c
==============================================================================
--- apr/apr/trunk/xml/apr_xml_xmllite.c Mon Aug 3 12:10:13 2026 (r1936805)
+++ apr/apr/trunk/xml/apr_xml_xmllite.c Mon Aug 3 12:12:58 2026 (r1936806)
@@ -369,11 +369,16 @@ static char * get_xmllite_errmsg(HRESULT
static apr_status_t handle_xmllite_err(apr_xml_parser *parser, HRESULT hr)
{
- parser->xp_err = hr;
-
- parser->xp_msg = get_xmllite_errmsg(hr);
- /* this misnomer is used as a test for (any) parser error. */
- parser->error = APR_XML_ERROR_EXPAT;
+ /* Check if this is XMLLite's depth limit error */
+ if (hr == SC_E_MAXELEMENTDEPTH) {
+ parser->error = APR_XML_ERROR_DEPTH_LIMIT;
+ }
+ else {
+ parser->xp_err = hr;
+ parser->xp_msg = get_xmllite_errmsg(hr);
+ /* this misnomer is used as a test for (any) parser error. */
+ parser->error = APR_XML_ERROR_EXPAT;
+ }
return APR_EGENERAL;
}