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;
 }