This is an automated email from the ASF dual-hosted git repository.

ardovm pushed a commit to branch AOO41X
in repository https://gitbox.apache.org/repos/asf/openoffice.git


The following commit(s) were added to refs/heads/AOO41X by this push:
     new 553426296e Align to expat-2.2.13
553426296e is described below

commit 553426296e0d42c60ca9cff5cf648e07e1f881a0
Author: Arrigo Marchiori <[email protected]>
AuthorDate: Sat Nov 12 10:29:52 2022 +0100

    Align to expat-2.2.13
    
    Patch by Carl Marcum.
    
    (cherry picked from commit 4ad3f9e955ba9bfdf2c6f709f60fdfc6f095c25a)
---
 main/expat/expat-2.2.10.patch | 1093 ++++++++++-------------------------------
 1 file changed, 255 insertions(+), 838 deletions(-)

diff --git a/main/expat/expat-2.2.10.patch b/main/expat/expat-2.2.10.patch
index 0de793638a..2690f58c52 100644
--- a/main/expat/expat-2.2.10.patch
+++ b/main/expat/expat-2.2.10.patch
@@ -81,13 +81,19 @@
 +.INCLUDE :  set_wntx64.mk
 +.INCLUDE :    target.mk
 +.INCLUDE :  tg_wntx64.mk
-diff -ru misc/expat-2.2.10/Changes misc/build/expat-2.2.10/Changes
---- misc/expat-2.2.10/Changes  2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/Changes    2022-03-05 12:25:27.575396494 +0100
-@@ -2,6 +2,43 @@
+diff -ru expat-2.2.10/Changes misc/build/expat-2.2.10/Changes
+--- misc/expat-2.2.10/Changes  2020-10-03 11:14:57.000000000 -0400
++++ misc/build/expat-2.2.10/Changes    2022-10-11 18:20:29.490872000 -0400
+@@ -2,6 +2,49 @@
        https://github.com/libexpat/libexpat/labels/help%20wanted
        If you can help, please get in touch.  Thanks!
  
++Release 2.2.13 XXX XXXXX XX XXXX
++        Security fixes:
++       #629 #640  CVE-2022-40674 -- Heap use-after-free vulnerability in
++                    function doContent. Expected impact is denial of service
++                    or potentially arbitrary code execution.
++
 +
 +Release 2.2.11 XXX XXXXX XX XXXX
 +        Security fixes:
@@ -128,9 +134,9 @@ diff -ru misc/expat-2.2.10/Changes 
misc/build/expat-2.2.10/Changes
  Release 2.2.10 Sat October 3 2020
          Bug fixes:
    #390 #395 #398  Fix undefined behavior during parsing caused by
-diff -ru misc/expat-2.2.10/CMakeLists.txt 
misc/build/expat-2.2.10/CMakeLists.txt
---- misc/expat-2.2.10/CMakeLists.txt   2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/CMakeLists.txt     2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/CMakeLists.txt misc/build/expat-2.2.10/CMakeLists.txt
+--- expat-2.2.10/CMakeLists.txt        2020-10-03 11:14:57.000000000 -0400
++++ misc/build/expat-2.2.10/CMakeLists.txt     2021-08-25 18:35:36.883146000 
-0400
 @@ -448,14 +448,12 @@
          endif()
      endfunction()
@@ -148,9 +154,9 @@ diff -ru misc/expat-2.2.10/CMakeLists.txt 
misc/build/expat-2.2.10/CMakeLists.txt
      expat_add_test(runtestspp $<TARGET_FILE:runtestspp>)
  endif()
  
-diff -ru misc/expat-2.2.10/doc/Makefile.in 
misc/build/expat-2.2.10/doc/Makefile.in
---- misc/expat-2.2.10/doc/Makefile.in  2020-10-03 17:37:06.000000000 +0200
-+++ misc/build/expat-2.2.10/doc/Makefile.in    2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/doc/Makefile.in misc/build/expat-2.2.10/doc/Makefile.in
+--- expat-2.2.10/doc/Makefile.in       2020-10-03 11:37:06.000000000 -0400
++++ misc/build/expat-2.2.10/doc/Makefile.in    2021-07-18 18:17:02.628168000 
-0400
 @@ -1,7 +1,7 @@
 -# Makefile.in generated by automake 1.16.2 from Makefile.am.
 +# Makefile.in generated by automake 1.16.1 from Makefile.am.
@@ -169,9 +175,9 @@ diff -ru misc/expat-2.2.10/doc/Makefile.in 
misc/build/expat-2.2.10/doc/Makefile.
  sbindir = @sbindir@
  sharedstatedir = @sharedstatedir@
  srcdir = @srcdir@
-diff -ru misc/expat-2.2.10/doc/reference.html 
misc/build/expat-2.2.10/doc/reference.html
---- misc/expat-2.2.10/doc/reference.html       2020-09-25 19:47:39.000000000 
+0200
-+++ misc/build/expat-2.2.10/doc/reference.html 2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/doc/reference.html 
misc/build/expat-2.2.10/doc/reference.html
+--- expat-2.2.10/doc/reference.html    2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/doc/reference.html 2021-07-18 17:21:48.691559000 
-0400
 @@ -120,6 +120,13 @@
        <li><a href="#XML_GetInputContext">XML_GetInputContext</a></li>
      </ul>
@@ -285,9 +291,9 @@ diff -ru misc/expat-2.2.10/doc/reference.html 
misc/build/expat-2.2.10/doc/refere
  <h3><a name="miscellaneous">Miscellaneous functions</a></h3>
  
  <p>The functions in this section either obtain state information from
-diff -ru misc/expat-2.2.10/doc/xmlwf.xml misc/build/expat-2.2.10/doc/xmlwf.xml
---- misc/expat-2.2.10/doc/xmlwf.xml    2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/doc/xmlwf.xml      2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/doc/xmlwf.xml misc/build/expat-2.2.10/doc/xmlwf.xml
+--- expat-2.2.10/doc/xmlwf.xml 2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/doc/xmlwf.xml      2021-07-18 17:21:48.692559000 
-0400
 @@ -3,7 +3,7 @@
    <!ENTITY dhfirstname "<firstname>Scott</firstname>">
    <!ENTITY dhsurname   "<surname>Bronson</surname>">
@@ -358,9 +364,9 @@ diff -ru misc/expat-2.2.10/doc/xmlwf.xml 
misc/build/expat-2.2.10/doc/xmlwf.xml
  </literallayout>
  
        </para>
-diff -ru misc/expat-2.2.10/lib/expat.h misc/build/expat-2.2.10/lib/expat.h
---- misc/expat-2.2.10/lib/expat.h      2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/expat.h        2022-03-09 20:25:36.712575539 
+0100
+diff -ru expat-2.2.10/lib/expat.h misc/build/expat-2.2.10/lib/expat.h
+--- expat-2.2.10/lib/expat.h   2020-10-03 11:14:57.000000000 -0400
++++ misc/build/expat-2.2.10/lib/expat.h        2022-10-11 18:20:29.490872000 
-0400
 @@ -115,7 +115,10 @@
    XML_ERROR_RESERVED_PREFIX_XMLNS,
    XML_ERROR_RESERVED_NAMESPACE_URI,
@@ -412,9 +418,9 @@ diff -ru misc/expat-2.2.10/lib/expat.h 
misc/build/expat-2.2.10/lib/expat.h
  
  #ifdef __cplusplus
  }
-diff -ru misc/expat-2.2.10/lib/internal.h 
misc/build/expat-2.2.10/lib/internal.h
---- misc/expat-2.2.10/lib/internal.h   2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/internal.h     2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/lib/internal.h misc/build/expat-2.2.10/lib/internal.h
+--- expat-2.2.10/lib/internal.h        2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/internal.h     2021-07-18 17:21:48.692559000 
-0400
 @@ -101,10 +101,47 @@
  #  endif
  #endif
@@ -475,9 +481,9 @@ diff -ru misc/expat-2.2.10/lib/internal.h 
misc/build/expat-2.2.10/lib/internal.h
  
  #ifdef __cplusplus
  }
-diff -ru misc/expat-2.2.10/lib/libexpat.def 
misc/build/expat-2.2.10/lib/libexpat.def
---- misc/expat-2.2.10/lib/libexpat.def 2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/libexpat.def   2022-03-05 12:25:27.575396494 
+0100
+diff -ru expat-2.2.10/lib/libexpat.def misc/build/expat-2.2.10/lib/libexpat.def
+--- expat-2.2.10/lib/libexpat.def      2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/libexpat.def   2021-07-18 17:21:48.692559000 
-0400
 @@ -76,3 +76,6 @@
    XML_SetHashSalt @67
  ; added with version 2.2.5
@@ -486,9 +492,9 @@ diff -ru misc/expat-2.2.10/lib/libexpat.def 
misc/build/expat-2.2.10/lib/libexpat
 +  XML_SetBillionLaughsAttackProtectionActivationThreshold @69
 +  XML_SetBillionLaughsAttackProtectionMaximumAmplification @70  
 \ No newline at end of file
-diff -ru misc/expat-2.2.10/lib/libexpatw.def 
misc/build/expat-2.2.10/lib/libexpatw.def
---- misc/expat-2.2.10/lib/libexpatw.def        2020-09-25 19:47:39.000000000 
+0200
-+++ misc/build/expat-2.2.10/lib/libexpatw.def  2022-03-05 12:25:27.579396586 
+0100
+diff -ru expat-2.2.10/lib/libexpatw.def 
misc/build/expat-2.2.10/lib/libexpatw.def
+--- expat-2.2.10/lib/libexpatw.def     2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/libexpatw.def  2021-07-18 17:21:48.692559000 
-0400
 @@ -76,3 +76,6 @@
    XML_SetHashSalt @67
  ; added with version 2.2.5
@@ -497,9 +503,9 @@ diff -ru misc/expat-2.2.10/lib/libexpatw.def 
misc/build/expat-2.2.10/lib/libexpa
 +  XML_SetBillionLaughsAttackProtectionActivationThreshold @69
 +  XML_SetBillionLaughsAttackProtectionMaximumAmplification @70
 \ No newline at end of file
-diff -ru misc/expat-2.2.10/lib/Makefile.in 
misc/build/expat-2.2.10/lib/Makefile.in
---- misc/expat-2.2.10/lib/Makefile.in  2020-10-03 17:37:06.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/Makefile.in    2022-03-05 12:25:27.579396586 
+0100
+diff -ru expat-2.2.10/lib/Makefile.in misc/build/expat-2.2.10/lib/Makefile.in
+--- expat-2.2.10/lib/Makefile.in       2020-10-03 11:37:06.000000000 -0400
++++ misc/build/expat-2.2.10/lib/Makefile.in    2021-07-18 18:17:02.702168000 
-0400
 @@ -1,7 +1,7 @@
 -# Makefile.in generated by automake 1.16.2 from Makefile.am.
 +# Makefile.in generated by automake 1.16.1 from Makefile.am.
@@ -518,9 +524,9 @@ diff -ru misc/expat-2.2.10/lib/Makefile.in 
misc/build/expat-2.2.10/lib/Makefile.
  sbindir = @sbindir@
  sharedstatedir = @sharedstatedir@
  srcdir = @srcdir@
-diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
---- misc/expat-2.2.10/lib/xmlparse.c   2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/xmlparse.c     2022-03-09 20:25:36.712575539 
+0100
+diff -ru expat-2.2.10/lib/xmlparse.c misc/build/expat-2.2.10/lib/xmlparse.c
+--- expat-2.2.10/lib/xmlparse.c        2020-10-03 11:14:57.000000000 -0400
++++ misc/build/expat-2.2.10/lib/xmlparse.c     2022-10-11 18:20:29.491872000 
-0400
 @@ -47,6 +47,7 @@
  #include <limits.h> /* UINT_MAX */
  #include <stdio.h>  /* fprintf */
@@ -540,15 +546,6 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  #elif defined(HAVE_EXPAT_CONFIG_H)
  #  include <expat_config.h>
  #endif /* ndef _WIN32 */
-@@ -116,7 +121,7 @@
-       * BSD / macOS (including <10.7) (arc4random): HAVE_ARC4RANDOM, \
-       * libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \
-       * libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \
--      * Linux (including <3.17) / BSD / macOS (including <10.7) 
(/dev/urandom): XML_DEV_URANDOM, \
-+      * Linux (including <3.17) / BSD / macOS (including <10.7) / Solaris >=8 
(/dev/urandom): XML_DEV_URANDOM, \
-       * Windows >=Vista (rand_s): _WIN32. \
-     \
-     If insist on not using any of these, bypass this error by defining \
 @@ -382,6 +387,31 @@
    XML_Bool betweenDecl; /* WFC: PE Between Declarations */
  } OPEN_INTERNAL_ENTITY;
@@ -681,7 +678,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  };
  
  #define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s)))
-@@ -640,9 +708,11 @@
+@@ -640,6 +708,7 @@
  XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) {
    XML_Char tmp[2];
    *tmp = nsSep;
@@ -689,11 +686,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    return XML_ParserCreate_MM(encodingName, NULL, tmp);
  }
  
-+// "xml=http://www.w3.org/XML/1998/namespace";
- static const XML_Char implicitContext[]
-     = {ASCII_x,     ASCII_m,     ASCII_l,      ASCII_EQUALS, ASCII_h,
-        ASCII_t,     ASCII_t,     ASCII_p,      ASCII_COLON,  ASCII_SLASH,
-@@ -809,9 +879,8 @@
+@@ -809,9 +878,8 @@
  
  static unsigned long
  ENTROPY_DEBUG(const char *label, unsigned long entropy) {
@@ -705,7 +698,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
              (int)sizeof(entropy) * 2, entropy, (unsigned 
long)sizeof(entropy));
    }
    return entropy;
-@@ -855,7 +924,7 @@
+@@ -855,7 +923,7 @@
      return ENTROPY_DEBUG("fallback(4)", entropy * 2147483647);
    } else {
      return ENTROPY_DEBUG("fallback(8)",
@@ -714,7 +707,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    }
  #endif
  }
-@@ -1073,6 +1142,18 @@
+@@ -1073,6 +1141,18 @@
    parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
  #endif
    parser->m_hash_secret_salt = 0;
@@ -733,7 +726,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  }
  
  /* moves list of bindings to m_freeBindingList */
-@@ -1255,6 +1336,7 @@
+@@ -1255,6 +1335,7 @@
    if (parser->m_ns) {
      XML_Char tmp[2];
      *tmp = parser->m_namespaceSeparator;
@@ -741,7 +734,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
    } else {
      parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
-@@ -1893,6 +1975,12 @@
+@@ -1893,6 +1974,12 @@
      parser->m_errorCode = XML_ERROR_FINISHED;
      return XML_STATUS_ERROR;
    case XML_INITIALIZED:
@@ -754,7 +747,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      if (parser->m_parentParser == NULL && ! startParsing(parser)) {
        parser->m_errorCode = XML_ERROR_NO_MEMORY;
        return XML_STATUS_ERROR;
-@@ -1971,6 +2059,11 @@
+@@ -1971,6 +2058,11 @@
      keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
      if (keep > XML_CONTEXT_BYTES)
        keep = XML_CONTEXT_BYTES;
@@ -766,7 +759,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      neededSize += keep;
  #endif /* defined XML_CONTEXT_BYTES */
      if (neededSize
-@@ -2337,6 +2430,13 @@
+@@ -2337,6 +2429,13 @@
    /* Added in 2.2.5. */
    case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */
      return XML_L("invalid argument");
@@ -780,7 +773,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    }
    return NULL;
  }
-@@ -2373,41 +2473,75 @@
+@@ -2373,41 +2472,75 @@
  
  const XML_Feature *XMLCALL
  XML_GetFeatureList(void) {
@@ -871,7 +864,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  /* Initially tag->rawName always points into the parse buffer;
     for those TAG instances opened while the current parse buffer was
     processed, and not yet closed, we need to store tag->rawName in a more
-@@ -2419,6 +2553,7 @@
+@@ -2419,6 +2552,7 @@
    while (tag) {
      int bufSize;
      int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
@@ -879,7 +872,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      char *rawNameBuf = tag->buf + nameLen;
      /* Stop if already stored.  Since m_tagStack is a stack, we can stop
         at the first entry that has already been copied; everything
-@@ -2430,7 +2565,11 @@
+@@ -2430,7 +2564,11 @@
      /* For re-use purposes we need to ensure that the
         size of tag->buf is a multiple of sizeof(XML_Char).
      */
@@ -892,7 +885,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      if (bufSize > tag->bufEnd - tag->buf) {
        char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
        if (temp == NULL)
-@@ -2460,9 +2599,9 @@
+@@ -2460,9 +2598,9 @@
  static enum XML_Error PTRCALL
  contentProcessor(XML_Parser parser, const char *start, const char *end,
                   const char **endPtr) {
@@ -905,7 +898,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    if (result == XML_ERROR_NONE) {
      if (! storeRawNames(parser))
        return XML_ERROR_NO_MEMORY;
-@@ -2487,6 +2626,14 @@
+@@ -2487,6 +2625,14 @@
    int tok = XmlContentTok(parser->m_encoding, start, end, &next);
    switch (tok) {
    case XML_TOK_BOM:
@@ -920,7 +913,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      /* If we are at the end of the buffer, this would cause the next stage,
         i.e. externalEntityInitProcessor3, to pass control directly to
         doContent (by detecting XML_TOK_NONE) without processing any xml text
-@@ -2524,6 +2671,10 @@
+@@ -2524,6 +2670,10 @@
    const char *next = start; /* XmlContentTok doesn't always set the last arg 
*/
    parser->m_eventPtr = start;
    tok = XmlContentTok(parser->m_encoding, start, end, &next);
@@ -931,7 +924,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    parser->m_eventEndPtr = next;
  
    switch (tok) {
-@@ -2565,7 +2716,8 @@
+@@ -2565,7 +2715,8 @@
                                 const char *end, const char **endPtr) {
    enum XML_Error result
        = doContent(parser, 1, parser->m_encoding, start, end, endPtr,
@@ -941,7 +934,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    if (result == XML_ERROR_NONE) {
      if (! storeRawNames(parser))
        return XML_ERROR_NO_MEMORY;
-@@ -2576,7 +2728,7 @@
+@@ -2576,7 +2727,7 @@
  static enum XML_Error
  doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
            const char *s, const char *end, const char **nextPtr,
@@ -950,7 +943,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    /* save one level of indirection */
    DTD *const dtd = parser->m_dtd;
  
-@@ -2594,6 +2746,17 @@
+@@ -2594,6 +2745,17 @@
    for (;;) {
      const char *next = s; /* XmlContentTok doesn't always set the last arg */
      int tok = XmlContentTok(enc, s, end, &next);
@@ -968,7 +961,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      *eventEndPP = next;
      switch (tok) {
      case XML_TOK_TRAILING_CR:
-@@ -2649,6 +2812,14 @@
+@@ -2649,6 +2811,14 @@
        XML_Char ch = (XML_Char)XmlPredefinedEntityName(
            enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar);
        if (ch) {
@@ -983,7 +976,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          if (parser->m_characterDataHandler)
            parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1);
          else if (parser->m_defaultHandler)
-@@ -2767,7 +2938,7 @@
+@@ -2767,7 +2937,7 @@
        }
        tag->name.str = (XML_Char *)tag->buf;
        *toPtr = XML_T('\0');
@@ -992,7 +985,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        if (result)
          return result;
        if (parser->m_startElementHandler)
-@@ -2791,7 +2962,8 @@
+@@ -2791,7 +2961,8 @@
        if (! name.str)
          return XML_ERROR_NO_MEMORY;
        poolFinish(&parser->m_tempPool);
@@ -1002,7 +995,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        if (result != XML_ERROR_NONE) {
          freeBindings(parser, bindings);
          return result;
-@@ -2926,7 +3098,7 @@
+@@ -2926,7 +3097,7 @@
        /* END disabled code */
        else if (parser->m_defaultHandler)
          reportDefault(parser, enc, s, next);
@@ -1011,7 +1004,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        if (result != XML_ERROR_NONE)
          return result;
        else if (! next) {
-@@ -3055,7 +3227,8 @@
+@@ -3055,7 +3226,8 @@
  */
  static enum XML_Error
  storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
@@ -1021,7 +1014,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    DTD *const dtd = parser->m_dtd; /* save one level of indirection */
    ELEMENT_TYPE *elementType;
    int nDefaultAtts;
-@@ -3087,13 +3260,38 @@
+@@ -3087,13 +3259,38 @@
  
    /* get the attributes from the tokenizer */
    n = XmlGetAttributes(enc, attStr, parser->m_attsSize, parser->m_atts);
@@ -1060,7 +1053,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts,
                                  parser->m_attsSize * sizeof(ATTRIBUTE));
      if (temp == NULL) {
-@@ -3102,6 +3300,17 @@
+@@ -3102,6 +3299,17 @@
      }
      parser->m_atts = temp;
  #ifdef XML_ATTR_INFO
@@ -1078,7 +1071,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo,
                                      parser->m_attsSize * 
sizeof(XML_AttrInfo));
      if (temp2 == NULL) {
-@@ -3165,7 +3374,7 @@
+@@ -3165,7 +3373,7 @@
        /* normalize the attribute value */
        result = storeAttributeValue(
            parser, enc, isCdata, parser->m_atts[i].valuePtr,
@@ -1087,7 +1080,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        if (result)
          return result;
        appAtts[attIndex] = poolStart(&parser->m_tempPool);
-@@ -3240,8 +3449,16 @@
+@@ -3240,8 +3448,16 @@
    if (nPrefixes) {
      int j; /* hash table index */
      unsigned long version = parser->m_nsAttsVersion;
@@ -1106,7 +1099,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      /* size of hash table must be at least 2 * (# of prefixed attributes) */
      if ((nPrefixes << 1)
          >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */
-@@ -3251,7 +3468,28 @@
+@@ -3251,7 +3467,28 @@
          ;
        if (parser->m_nsAttsPower < 3)
          parser->m_nsAttsPower = 3;
@@ -1136,7 +1129,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts,
                                 nsAttsSize * sizeof(NS_ATT));
        if (! temp) {
-@@ -3409,9 +3647,31 @@
+@@ -3409,9 +3646,31 @@
    tagNamePtr->prefixLen = prefixLen;
    for (i = 0; localPart[i++];)
      ; /* i includes null terminator */
@@ -1168,170 +1161,25 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char));
      if (! uri)
        return XML_ERROR_NO_MEMORY;
-@@ -3436,12 +3696,124 @@
-   return XML_ERROR_NONE;
- }
- 
-+static XML_Bool
-+is_rfc3986_uri_char(XML_Char candidate) {
-+  // For the RFC 3986 ANBF grammar see
-+  // https://datatracker.ietf.org/doc/html/rfc3986#appendix-A
-+
-+  switch (candidate) {
-+  // From rule "ALPHA" (uppercase half)
-+  case 'A':
-+  case 'B':
-+  case 'C':
-+  case 'D':
-+  case 'E':
-+  case 'F':
-+  case 'G':
-+  case 'H':
-+  case 'I':
-+  case 'J':
-+  case 'K':
-+  case 'L':
-+  case 'M':
-+  case 'N':
-+  case 'O':
-+  case 'P':
-+  case 'Q':
-+  case 'R':
-+  case 'S':
-+  case 'T':
-+  case 'U':
-+  case 'V':
-+  case 'W':
-+  case 'X':
-+  case 'Y':
-+  case 'Z':
-+
-+  // From rule "ALPHA" (lowercase half)
-+  case 'a':
-+  case 'b':
-+  case 'c':
-+  case 'd':
-+  case 'e':
-+  case 'f':
-+  case 'g':
-+  case 'h':
-+  case 'i':
-+  case 'j':
-+  case 'k':
-+  case 'l':
-+  case 'm':
-+  case 'n':
-+  case 'o':
-+  case 'p':
-+  case 'q':
-+  case 'r':
-+  case 's':
-+  case 't':
-+  case 'u':
-+  case 'v':
-+  case 'w':
-+  case 'x':
-+  case 'y':
-+  case 'z':
-+
-+  // From rule "DIGIT"
-+  case '0':
-+  case '1':
-+  case '2':
-+  case '3':
-+  case '4':
-+  case '5':
-+  case '6':
-+  case '7':
-+  case '8':
-+  case '9':
-+
-+  // From rule "pct-encoded"
-+  case '%':
-+
-+  // From rule "unreserved"
-+  case '-':
-+  case '.':
-+  case '_':
-+  case '~':
-+
-+  // From rule "gen-delims"
-+  case ':':
-+  case '/':
-+  case '?':
-+  case '#':
-+  case '[':
-+  case ']':
-+  case '@':
-+
-+  // From rule "sub-delims"
-+  case '!':
-+  case '$':
-+  case '&':
-+  case '\'':
-+  case '(':
-+  case ')':
-+  case '*':
-+  case '+':
-+  case ',':
-+  case ';':
-+  case '=':
-+    return XML_TRUE;
-+
-+  default:
-+    return XML_FALSE;
-+  }
-+}
-+
- /* addBinding() overwrites the value of prefix->binding without checking.
-    Therefore one must keep track of the old value outside of addBinding().
- */
- static enum XML_Error
- addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
-            const XML_Char *uri, BINDING **bindingsPtr) {
-+  // "http://www.w3.org/XML/1998/namespace";
-   static const XML_Char xmlNamespace[]
-       = {ASCII_h,      ASCII_t,     ASCII_t,     ASCII_p,      ASCII_COLON,
-          ASCII_SLASH,  ASCII_SLASH, ASCII_w,     ASCII_w,      ASCII_w,
-@@ -3452,6 +3824,7 @@
-          ASCII_e,      ASCII_s,     ASCII_p,     ASCII_a,      ASCII_c,
-          ASCII_e,      '\0'};
-   static const int xmlLen = (int)sizeof(xmlNamespace) / sizeof(XML_Char) - 1;
-+  // "http://www.w3.org/2000/xmlns/";
-   static const XML_Char xmlnsNamespace[]
-       = {ASCII_h,     ASCII_t,      ASCII_t, ASCII_p, ASCII_COLON,  
ASCII_SLASH,
-          ASCII_SLASH, ASCII_w,      ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w,
-@@ -3491,6 +3864,29 @@
+@@ -3491,6 +3750,17 @@
      if (! mustBeXML && isXMLNS
          && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
        isXMLNS = XML_FALSE;
 +
-+    // NOTE: While Expat does not validate namespace URIs against RFC 3986
-+    //       today (and is not REQUIRED to do so with regard to the XML 1.0
-+    //       namespaces specification) we have to at least make sure, that
-+    //       the application on top of Expat (that is likely splitting 
expanded
-+    //       element names ("qualified names") of form
-+    //       "[uri sep] local [sep prefix] '\0'" back into 1, 2 or 3 pieces
-+    //       in its element handler code) cannot be confused by an attacker
-+    //       putting additional namespace separator characters into namespace
-+    //       declarations.  That would be ambiguous and not to be expected.
-+    //
-+    //       While the HTML API docs of function XML_ParserCreateNS have been
-+    //       advising against use of a namespace separator character that can
-+    //       appear in a URI for >20 years now, some widespread applications
-+    //       are using URI characters (':' (colon) in particular) for a
-+    //       namespace separator, in practice.  To keep these applications
-+    //       functional, we only reject namespaces URIs containing the
-+    //       application-chosen namespace separator if the chosen separator
-+    //       is a non-URI character with regard to RFC 3986.
-+    if (parser->m_ns && (uri[len] == parser->m_namespaceSeparator)
-+        && ! is_rfc3986_uri_char(uri[len])) {
++    // NOTE: While Expat does not validate namespace URIs against RFC 3986,
++    //       we have to at least make sure that the XML processor on top of
++    //       Expat (that is splitting tag names by namespace separator into
++    //       2- or 3-tuples (uri-local or uri-local-prefix)) cannot be 
confused
++    //       by an attacker putting additional namespace separator characters
++    //       into namespace declarations.  That would be ambiguous and not to
++    //       be expected.
++    if (parser->m_ns && (uri[len] == parser->m_namespaceSeparator)) {
 +      return XML_ERROR_SYNTAX;
 +    }
    }
    isXML = isXML && len == xmlLen;
    isXMLNS = isXMLNS && len == xmlnsLen;
-@@ -3507,7 +3903,24 @@
+@@ -3507,7 +3777,24 @@
    if (parser->m_freeBindingList) {
      b = parser->m_freeBindingList;
      if (len > b->uriAlloc) {
@@ -1357,7 +1205,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
            parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE));
        if (temp == NULL)
          return XML_ERROR_NO_MEMORY;
-@@ -3519,6 +3932,21 @@
+@@ -3519,6 +3806,21 @@
      b = (BINDING *)MALLOC(parser, sizeof(BINDING));
      if (! b)
        return XML_ERROR_NO_MEMORY;
@@ -1379,7 +1227,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      b->uri
          = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE));
      if (! b->uri) {
-@@ -3556,7 +3984,7 @@
+@@ -3556,7 +3858,7 @@
                        const char **endPtr) {
    enum XML_Error result
        = doCdataSection(parser, parser->m_encoding, &start, end, endPtr,
@@ -1388,7 +1236,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    if (result != XML_ERROR_NONE)
      return result;
    if (start) {
-@@ -3576,7 +4004,8 @@
+@@ -3576,7 +3878,8 @@
  */
  static enum XML_Error
  doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr,
@@ -1398,7 +1246,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    const char *s = *startPtr;
    const char **eventPP;
    const char **eventEndPP;
-@@ -3594,6 +4023,12 @@
+@@ -3594,6 +3897,12 @@
    for (;;) {
      const char *next = s; /* in case of XML_TOK_NONE or XML_TOK_PARTIAL */
      int tok = XmlCdataSectionTok(enc, s, end, &next);
@@ -1411,7 +1259,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      *eventEndPP = next;
      switch (tok) {
      case XML_TOK_CDATA_SECT_CLOSE:
-@@ -3738,6 +4173,13 @@
+@@ -3738,6 +4047,13 @@
    *eventPP = s;
    *startPtr = NULL;
    tok = XmlIgnoreSectionTok(enc, s, end, &next);
@@ -1425,16 +1273,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    *eventEndPP = next;
    switch (tok) {
    case XML_TOK_IGNORE_SECT:
-@@ -3787,7 +4229,7 @@
-   const char *s;
- #ifdef XML_UNICODE
-   char encodingBuf[128];
--  /* See comments abount `protoclEncodingName` in parserInit() */
-+  /* See comments about `protocolEncodingName` in parserInit() */
-   if (! parser->m_protocolEncodingName)
-     s = NULL;
-   else {
-@@ -3822,6 +4264,15 @@
+@@ -3822,6 +4138,15 @@
    const char *versionend;
    const XML_Char *storedversion = NULL;
    int standalone = -1;
@@ -1450,7 +1289,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    if (! (parser->m_ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)(
            isGeneralTextEntity, parser->m_encoding, s, next, 
&parser->m_eventPtr,
            &version, &versionend, &encodingName, &newEncoding, &standalone)) {
-@@ -3971,6 +4422,10 @@
+@@ -3971,6 +4296,10 @@
  
    for (;;) {
      tok = XmlPrologTok(parser->m_encoding, start, end, &next);
@@ -1461,7 +1300,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      parser->m_eventEndPtr = next;
      if (tok <= 0) {
        if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
-@@ -3989,7 +4444,8 @@
+@@ -3989,7 +4318,8 @@
          break;
        }
        /* found end of entity value - can store it now */
@@ -1471,7 +1310,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      } else if (tok == XML_TOK_XML_DECL) {
        enum XML_Error result;
        result = processXmlDecl(parser, 0, start, next);
-@@ -4016,6 +4472,14 @@
+@@ -4016,6 +4346,14 @@
      */
      else if (tok == XML_TOK_BOM && next == end
               && ! parser->m_parsingStatus.finalBuffer) {
@@ -1486,7 +1325,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        *nextPtr = next;
        return XML_ERROR_NONE;
      }
-@@ -4058,16 +4522,24 @@
+@@ -4058,16 +4396,24 @@
    }
    /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
       However, when parsing an external subset, doProlog will not accept a BOM
@@ -1513,7 +1352,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  }
  
  static enum XML_Error PTRCALL
-@@ -4080,6 +4552,9 @@
+@@ -4080,6 +4426,9 @@
  
    for (;;) {
      tok = XmlPrologTok(enc, start, end, &next);
@@ -1523,7 +1362,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      if (tok <= 0) {
        if (! parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
          *nextPtr = s;
-@@ -4097,7 +4572,7 @@
+@@ -4097,7 +4446,7 @@
          break;
        }
        /* found end of entity value - can store it now */
@@ -1532,7 +1371,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      }
      start = next;
    }
-@@ -4111,13 +4586,14 @@
+@@ -4111,13 +4460,14 @@
    const char *next = s;
    int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
    return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
@@ -1549,7 +1388,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  #ifdef XML_DTD
    static const XML_Char externalSubsetName[] = {ASCII_HASH, '\0'};
  #endif /* XML_DTD */
-@@ -4144,6 +4620,10 @@
+@@ -4144,6 +4494,10 @@
    static const XML_Char enumValueSep[] = {ASCII_PIPE, '\0'};
    static const XML_Char enumValueStart[] = {ASCII_LPAREN, '\0'};
  
@@ -1560,7 +1399,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    /* save one level of indirection */
    DTD *const dtd = parser->m_dtd;
  
-@@ -4208,6 +4688,19 @@
+@@ -4208,6 +4562,19 @@
        }
      }
      role = XmlTokenRole(&parser->m_prologState, tok, s, next, enc);
@@ -1580,7 +1419,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      switch (role) {
      case XML_ROLE_XML_DECL: {
        enum XML_Error result = processXmlDecl(parser, 0, s, next);
-@@ -4483,7 +4976,8 @@
+@@ -4483,7 +4850,8 @@
          const XML_Char *attVal;
          enum XML_Error result = storeAttributeValue(
              parser, enc, parser->m_declAttributeIsCdata,
@@ -1590,7 +1429,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          if (result)
            return result;
          attVal = poolStart(&dtd->pool);
-@@ -4516,8 +5010,9 @@
+@@ -4516,8 +4884,9 @@
        break;
      case XML_ROLE_ENTITY_VALUE:
        if (dtd->keepProcessing) {
@@ -1602,7 +1441,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          if (parser->m_declEntity) {
            parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool);
            parser->m_declEntity->textLen
-@@ -4776,7 +5271,13 @@
+@@ -4776,7 +5145,13 @@
        if (parser->m_prologState.level >= parser->m_groupSize) {
          if (parser->m_groupSize) {
            {
@@ -1617,7 +1456,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
                  parser, parser->m_groupConnector, parser->m_groupSize *= 2);
              if (new_connector == NULL) {
                parser->m_groupSize /= 2;
-@@ -4786,7 +5287,18 @@
+@@ -4786,7 +5161,18 @@
            }
  
            if (dtd->scaffIndex) {
@@ -1637,7 +1476,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
                  parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int));
              if (new_scaff_index == NULL)
                return XML_ERROR_NO_MEMORY;
-@@ -4907,12 +5419,15 @@
+@@ -4907,12 +5293,15 @@
          if (parser->m_externalEntityRefHandler) {
            dtd->paramEntityRead = XML_FALSE;
            entity->open = XML_TRUE;
@@ -1653,7 +1492,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
            entity->open = XML_FALSE;
            handleDefault = XML_FALSE;
            if (! dtd->paramEntityRead) {
-@@ -4991,7 +5506,7 @@
+@@ -4991,7 +5380,7 @@
        if (dtd->in_eldecl) {
          ELEMENT_TYPE *el;
          const XML_Char *name;
@@ -1662,7 +1501,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          const char *nxt
              = (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar);
          int myindex = nextScaffoldPart(parser);
-@@ -5007,7 +5522,13 @@
+@@ -5007,7 +5396,13 @@
          nameLen = 0;
          for (; name[nameLen++];)
            ;
@@ -1677,7 +1516,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          if (parser->m_elementDeclHandler)
            handleDefault = XML_FALSE;
        }
-@@ -5110,6 +5631,13 @@
+@@ -5110,6 +5505,13 @@
    for (;;) {
      const char *next = NULL;
      int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
@@ -1691,7 +1530,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      parser->m_eventEndPtr = next;
      switch (tok) {
      /* report partial linebreak - it might be the last token */
-@@ -5183,6 +5711,9 @@
+@@ -5183,6 +5585,9 @@
        return XML_ERROR_NO_MEMORY;
    }
    entity->open = XML_TRUE;
@@ -1701,7 +1540,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    entity->processed = 0;
    openEntity->next = parser->m_openInternalEntities;
    parser->m_openInternalEntities = openEntity;
-@@ -5201,17 +5732,22 @@
+@@ -5201,17 +5606,22 @@
      int tok
          = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
      result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd,
@@ -1726,7 +1565,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        entity->open = XML_FALSE;
        parser->m_openInternalEntities = openEntity->next;
        /* put openEntity back in list of free instances */
-@@ -5244,12 +5780,13 @@
+@@ -5244,12 +5654,13 @@
      int tok
          = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
      result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd,
@@ -1742,7 +1581,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  
    if (result != XML_ERROR_NONE)
      return result;
-@@ -5258,6 +5795,9 @@
+@@ -5258,6 +5669,9 @@
      entity->processed = (int)(next - (const char *)entity->textPtr);
      return result;
    } else {
@@ -1752,7 +1591,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      entity->open = XML_FALSE;
      parser->m_openInternalEntities = openEntity->next;
      /* put openEntity back in list of free instances */
-@@ -5271,7 +5811,8 @@
+@@ -5271,15 +5685,22 @@
      parser->m_processor = prologProcessor;
      tok = XmlPrologTok(parser->m_encoding, s, end, &next);
      return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
@@ -1762,17 +1601,24 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    } else
  #endif /* XML_DTD */
    {
-@@ -5279,7 +5820,8 @@
+     parser->m_processor = contentProcessor;
      /* see externalEntityContentProcessor vs contentProcessor */
-     return doContent(parser, parser->m_parentParser ? 1 : 0, 
parser->m_encoding,
-                      s, end, nextPtr,
+-    return doContent(parser, parser->m_parentParser ? 1 : 0, 
parser->m_encoding,
+-                     s, end, nextPtr,
 -                     (XML_Bool)! parser->m_parsingStatus.finalBuffer);
-+                     (XML_Bool)! parser->m_parsingStatus.finalBuffer,
-+                     XML_ACCOUNT_DIRECT);
++    result = doContent(parser, parser->m_parentParser ? 1 : 0,
++                           parser->m_encoding, s, end, nextPtr,
++                           (XML_Bool)! parser->m_parsingStatus.finalBuffer,
++                           XML_ACCOUNT_DIRECT);
++    if (result == XML_ERROR_NONE) {
++      if (! storeRawNames(parser))
++        return XML_ERROR_NO_MEMORY;
++    }
++    return result;
    }
  }
  
-@@ -5294,9 +5836,10 @@
+@@ -5294,9 +5715,10 @@
  
  static enum XML_Error
  storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
@@ -1785,7 +1631,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    if (result)
      return result;
    if (! isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
-@@ -5308,11 +5851,23 @@
+@@ -5308,11 +5730,23 @@
  
  static enum XML_Error
  appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
@@ -1811,7 +1657,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      switch (tok) {
      case XML_TOK_NONE:
        return XML_ERROR_NONE;
-@@ -5372,6 +5927,14 @@
+@@ -5372,6 +5806,14 @@
        XML_Char ch = (XML_Char)XmlPredefinedEntityName(
            enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar);
        if (ch) {
@@ -1826,7 +1672,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          if (! poolAppendChar(pool, ch))
            return XML_ERROR_NO_MEMORY;
          break;
-@@ -5449,9 +6012,16 @@
+@@ -5449,9 +5891,16 @@
          enum XML_Error result;
          const XML_Char *textEnd = entity->textPtr + entity->textLen;
          entity->open = XML_TRUE;
@@ -1844,7 +1690,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
          entity->open = XML_FALSE;
          if (result)
            return result;
-@@ -5481,13 +6051,16 @@
+@@ -5481,13 +5930,16 @@
  
  static enum XML_Error
  storeEntityValue(XML_Parser parser, const ENCODING *enc,
@@ -1862,7 +1708,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
  #endif /* XML_DTD */
    /* never return Null for the value argument in EntityDeclHandler,
       since this would indicate an external entity; therefore we
-@@ -5498,8 +6071,19 @@
+@@ -5498,8 +5950,19 @@
    }
  
    for (;;) {
@@ -1883,7 +1729,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
      switch (tok) {
      case XML_TOK_PARAM_ENTITY_REF:
  #ifdef XML_DTD
-@@ -5535,13 +6119,16 @@
+@@ -5535,13 +5998,16 @@
            if (parser->m_externalEntityRefHandler) {
              dtd->paramEntityRead = XML_FALSE;
              entity->open = XML_TRUE;
@@ -1900,7 +1746,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
              entity->open = XML_FALSE;
              if (! dtd->paramEntityRead)
                dtd->keepProcessing = dtd->standalone;
-@@ -5549,9 +6136,12 @@
+@@ -5549,9 +6015,12 @@
              dtd->keepProcessing = dtd->standalone;
          } else {
            entity->open = XML_TRUE;
@@ -1914,7 +1760,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
            entity->open = XML_FALSE;
            if (result)
              goto endEntityValue;
-@@ -5784,7 +6374,25 @@
+@@ -5784,7 +6253,25 @@
        }
      } else {
        DEFAULT_ATTRIBUTE *temp;
@@ -1941,7 +1787,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        temp = (DEFAULT_ATTRIBUTE *)REALLOC(parser, type->defaultAtts,
                                            (count * 
sizeof(DEFAULT_ATTRIBUTE)));
        if (temp == NULL)
-@@ -6435,10 +7043,26 @@
+@@ -6435,10 +6922,26 @@
      /* check for overflow (table is half full) */
      if (table->used >> (table->power - 1)) {
        unsigned char newPower = table->power + 1;
@@ -1972,7 +1818,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        if (! newV)
          return NULL;
        memset(newV, 0, tsize);
-@@ -6786,6 +7410,20 @@
+@@ -6786,6 +7289,20 @@
    if (dtd->scaffCount >= dtd->scaffSize) {
      CONTENT_SCAFFOLD *temp;
      if (dtd->scaffold) {
@@ -1993,7 +1839,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
        temp = (CONTENT_SCAFFOLD *)REALLOC(
            parser, dtd->scaffold, dtd->scaffSize * 2 * 
sizeof(CONTENT_SCAFFOLD));
        if (temp == NULL)
-@@ -6817,55 +7455,134 @@
+@@ -6817,55 +7334,130 @@
    return next;
  }
  
@@ -2031,10 +1877,6 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
 -
  static XML_Content *
  build_model(XML_Parser parser) {
-+  /* Function build_model transforms the existing parser->m_dtd->scaffold
-+   * array of CONTENT_SCAFFOLD tree nodes into a new array of
-+   * XML_Content tree nodes followed by a gapless list of zero-terminated
-+   * strings. */
    DTD *const dtd = parser->m_dtd; /* save one level of indirection */
    XML_Content *ret;
 -  XML_Content *cpos;
@@ -2167,7 +2009,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    return ret;
  }
  
-@@ -6894,7 +7611,7 @@
+@@ -6894,7 +7486,7 @@
  
  static XML_Char *
  copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
@@ -2176,7 +2018,7 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
    XML_Char *result;
  
    /* First determine how long the string is */
-@@ -6912,3 +7629,766 @@
+@@ -6912,3 +7504,766 @@
    memcpy(result, s, charsRequired * sizeof(XML_Char));
    return result;
  }
@@ -2943,9 +2785,9 @@ diff -ru misc/expat-2.2.10/lib/xmlparse.c 
misc/build/expat-2.2.10/lib/xmlparse.c
 +
 +  return debugLevel;
 +}
-diff -ru misc/expat-2.2.10/lib/xmltok.c misc/build/expat-2.2.10/lib/xmltok.c
---- misc/expat-2.2.10/lib/xmltok.c     2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/xmltok.c       2022-03-05 12:25:27.583396678 
+0100
+diff -ru expat-2.2.10/lib/xmltok.c misc/build/expat-2.2.10/lib/xmltok.c
+--- expat-2.2.10/lib/xmltok.c  2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/xmltok.c       2022-10-11 15:32:24.331994000 
-0400
 @@ -269,8 +269,14 @@
  
  #define IS_NAME_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isName##n(enc, p))
@@ -2963,9 +2805,9 @@ diff -ru misc/expat-2.2.10/lib/xmltok.c 
misc/build/expat-2.2.10/lib/xmltok.c
  
  #ifdef XML_MIN_SIZE
  #  define IS_NAME_CHAR_MINBPC(enc, p)                                         
 \
-diff -ru misc/expat-2.2.10/lib/xmltok_impl.c 
misc/build/expat-2.2.10/lib/xmltok_impl.c
---- misc/expat-2.2.10/lib/xmltok_impl.c        2020-09-25 19:47:39.000000000 
+0200
-+++ misc/build/expat-2.2.10/lib/xmltok_impl.c  2022-03-05 12:25:27.583396678 
+0100
+diff -ru expat-2.2.10/lib/xmltok_impl.c 
misc/build/expat-2.2.10/lib/xmltok_impl.c
+--- expat-2.2.10/lib/xmltok_impl.c     2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/xmltok_impl.c  2022-10-11 15:32:24.332994000 
-0400
 @@ -61,7 +61,7 @@
    case BT_LEAD##n:                                                            
 \
      if (end - ptr < n)                                                        
 \
@@ -2995,9 +2837,9 @@ diff -ru misc/expat-2.2.10/lib/xmltok_impl.c 
misc/build/expat-2.2.10/lib/xmltok_
      if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                        
 \
        ptr += n;                                                               
 \
        tok = XML_TOK_NAME;                                                     
 \
-diff -ru misc/expat-2.2.10/lib/xmltok_ns.c 
misc/build/expat-2.2.10/lib/xmltok_ns.c
---- misc/expat-2.2.10/lib/xmltok_ns.c  2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/lib/xmltok_ns.c    2022-03-05 12:25:27.583396678 
+0100
+diff -ru expat-2.2.10/lib/xmltok_ns.c misc/build/expat-2.2.10/lib/xmltok_ns.c
+--- expat-2.2.10/lib/xmltok_ns.c       2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/lib/xmltok_ns.c    2022-10-11 15:32:24.333994000 
-0400
 @@ -89,7 +89,7 @@
  static const ENCODING *
  NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
@@ -3007,9 +2849,9 @@ diff -ru misc/expat-2.2.10/lib/xmltok_ns.c 
misc/build/expat-2.2.10/lib/xmltok_ns
    char *p = buf;
    int i;
    XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
-diff -ru misc/expat-2.2.10/tests/benchmark/Makefile.in 
misc/build/expat-2.2.10/tests/benchmark/Makefile.in
---- misc/expat-2.2.10/tests/benchmark/Makefile.in      2020-10-03 
17:37:06.000000000 +0200
-+++ misc/build/expat-2.2.10/tests/benchmark/Makefile.in        2022-03-05 
12:25:27.579396586 +0100
+diff -ru expat-2.2.10/tests/benchmark/Makefile.in 
misc/build/expat-2.2.10/tests/benchmark/Makefile.in
+--- expat-2.2.10/tests/benchmark/Makefile.in   2020-10-03 11:37:06.000000000 
-0400
++++ misc/build/expat-2.2.10/tests/benchmark/Makefile.in        2021-07-18 
18:17:02.796167000 -0400
 @@ -1,7 +1,7 @@
 -# Makefile.in generated by automake 1.16.2 from Makefile.am.
 +# Makefile.in generated by automake 1.16.1 from Makefile.am.
@@ -3028,9 +2870,9 @@ diff -ru misc/expat-2.2.10/tests/benchmark/Makefile.in 
misc/build/expat-2.2.10/t
  sbindir = @sbindir@
  sharedstatedir = @sharedstatedir@
  srcdir = @srcdir@
-diff -ru misc/expat-2.2.10/tests/Makefile.in 
misc/build/expat-2.2.10/tests/Makefile.in
---- misc/expat-2.2.10/tests/Makefile.in        2020-10-03 17:37:06.000000000 
+0200
-+++ misc/build/expat-2.2.10/tests/Makefile.in  2022-03-05 12:25:27.579396586 
+0100
+diff -ru expat-2.2.10/tests/Makefile.in 
misc/build/expat-2.2.10/tests/Makefile.in
+--- expat-2.2.10/tests/Makefile.in     2020-10-03 11:37:06.000000000 -0400
++++ misc/build/expat-2.2.10/tests/Makefile.in  2021-07-18 18:17:02.770167000 
-0400
 @@ -1,7 +1,7 @@
 -# Makefile.in generated by automake 1.16.2 from Makefile.am.
 +# Makefile.in generated by automake 1.16.1 from Makefile.am.
@@ -3049,9 +2891,9 @@ diff -ru misc/expat-2.2.10/tests/Makefile.in 
misc/build/expat-2.2.10/tests/Makef
  sbindir = @sbindir@
  sharedstatedir = @sharedstatedir@
  srcdir = @srcdir@
-diff -ru misc/expat-2.2.10/tests/minicheck.c 
misc/build/expat-2.2.10/tests/minicheck.c
---- misc/expat-2.2.10/tests/minicheck.c        2020-09-25 19:47:39.000000000 
+0200
-+++ misc/build/expat-2.2.10/tests/minicheck.c  2022-03-05 12:25:27.587396769 
+0100
+diff -ru expat-2.2.10/tests/minicheck.c 
misc/build/expat-2.2.10/tests/minicheck.c
+--- expat-2.2.10/tests/minicheck.c     2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/tests/minicheck.c  2022-10-11 15:32:24.333994000 
-0400
 @@ -141,11 +141,18 @@
  }
  
@@ -3123,9 +2965,9 @@ diff -ru misc/expat-2.2.10/tests/minicheck.c 
misc/build/expat-2.2.10/tests/minic
    if (msg != NULL) {
      const int has_newline = (msg[strlen(msg) - 1] == '\n');
      fprintf(stderr, "ERROR: %s%s", msg, has_newline ? "" : "\n");
-diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtests.c
---- misc/expat-2.2.10/tests/runtests.c 2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/tests/runtests.c   2022-03-09 20:25:36.716575629 
+0100
+diff -ru expat-2.2.10/tests/runtests.c misc/build/expat-2.2.10/tests/runtests.c
+--- expat-2.2.10/tests/runtests.c      2020-10-03 11:14:57.000000000 -0400
++++ misc/build/expat-2.2.10/tests/runtests.c   2022-10-11 18:20:29.493872000 
-0400
 @@ -45,6 +45,7 @@
  #include <stddef.h> /* ptrdiff_t */
  #include <ctype.h>
@@ -3143,307 +2985,86 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
  #include "minicheck.h"
  #include "memcheck.h"
  #include "siphash.h"
-@@ -2677,6 +2678,82 @@
+@@ -4904,6 +4905,78 @@
  }
  END_TEST
  
-+static void XMLCALL
-+element_decl_check_model(void *userData, const XML_Char *name,
-+                         XML_Content *model) {
-+  uint32_t errorFlags = 0;
-+  UNUSED_P(userData);
-+
-+  /* Expected model array structure is this:
-+   * [0] (type 6, quant 0)
-+   *   [1] (type 5, quant 0)
-+   *     [3] (type 4, quant 0, name "bar")
-+   *     [4] (type 4, quant 0, name "foo")
-+   *     [5] (type 4, quant 3, name "xyz")
-+   *   [2] (type 4, quant 2, name "zebra")
-+   */
-+  errorFlags |= ((xcstrcmp(name, XCS("junk")) == 0) ? 0 : (1u << 0));
-+  errorFlags |= ((model != NULL) ? 0 : (1u << 1));
-+
-+  errorFlags |= ((model[0].type == XML_CTYPE_SEQ) ? 0 : (1u << 2));
-+  errorFlags |= ((model[0].quant == XML_CQUANT_NONE) ? 0 : (1u << 3));
-+  errorFlags |= ((model[0].numchildren == 2) ? 0 : (1u << 4));
-+  errorFlags |= ((model[0].children == &model[1]) ? 0 : (1u << 5));
-+  errorFlags |= ((model[0].name == NULL) ? 0 : (1u << 6));
-+
-+  errorFlags |= ((model[1].type == XML_CTYPE_CHOICE) ? 0 : (1u << 7));
-+  errorFlags |= ((model[1].quant == XML_CQUANT_NONE) ? 0 : (1u << 8));
-+  errorFlags |= ((model[1].numchildren == 3) ? 0 : (1u << 9));
-+  errorFlags |= ((model[1].children == &model[3]) ? 0 : (1u << 10));
-+  errorFlags |= ((model[1].name == NULL) ? 0 : (1u << 11));
-+
-+  errorFlags |= ((model[2].type == XML_CTYPE_NAME) ? 0 : (1u << 12));
-+  errorFlags |= ((model[2].quant == XML_CQUANT_REP) ? 0 : (1u << 13));
-+  errorFlags |= ((model[2].numchildren == 0) ? 0 : (1u << 14));
-+  errorFlags |= ((model[2].children == NULL) ? 0 : (1u << 15));
-+  errorFlags |= ((xcstrcmp(model[2].name, XCS("zebra")) == 0) ? 0 : (1u << 
16));
-+
-+  errorFlags |= ((model[3].type == XML_CTYPE_NAME) ? 0 : (1u << 17));
-+  errorFlags |= ((model[3].quant == XML_CQUANT_NONE) ? 0 : (1u << 18));
-+  errorFlags |= ((model[3].numchildren == 0) ? 0 : (1u << 19));
-+  errorFlags |= ((model[3].children == NULL) ? 0 : (1u << 20));
-+  errorFlags |= ((xcstrcmp(model[3].name, XCS("bar")) == 0) ? 0 : (1u << 21));
-+
-+  errorFlags |= ((model[4].type == XML_CTYPE_NAME) ? 0 : (1u << 22));
-+  errorFlags |= ((model[4].quant == XML_CQUANT_NONE) ? 0 : (1u << 23));
-+  errorFlags |= ((model[4].numchildren == 0) ? 0 : (1u << 24));
-+  errorFlags |= ((model[4].children == NULL) ? 0 : (1u << 25));
-+  errorFlags |= ((xcstrcmp(model[4].name, XCS("foo")) == 0) ? 0 : (1u << 26));
-+
-+  errorFlags |= ((model[5].type == XML_CTYPE_NAME) ? 0 : (1u << 27));
-+  errorFlags |= ((model[5].quant == XML_CQUANT_PLUS) ? 0 : (1u << 28));
-+  errorFlags |= ((model[5].numchildren == 0) ? 0 : (1u << 29));
-+  errorFlags |= ((model[5].children == NULL) ? 0 : (1u << 30));
-+  errorFlags |= ((xcstrcmp(model[5].name, XCS("xyz")) == 0) ? 0 : (1u << 31));
-+
-+  XML_SetUserData(g_parser, (void *)(uintptr_t)errorFlags);
-+  XML_FreeContentModel(g_parser, model);
++void
++suspending_comment_handler(void *userData, const XML_Char *data) {
++  UNUSED_P(data);
++  XML_Parser parser = (XML_Parser)userData;
++  XML_StopParser(parser, XML_TRUE);
 +}
 +
-+START_TEST(test_dtd_elements_nesting) {
-+  // Payload inspired by a test in Perl's XML::Parser
-+  const char *text = "<!DOCTYPE foo [\n"
-+                     "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>\n"
-+                     "]>\n"
-+                     "<foo/>";
-+
-+  XML_SetUserData(g_parser, (void *)(uintptr_t)-1);
-+
-+  XML_SetElementDeclHandler(g_parser, element_decl_check_model);
-+  if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
-+      == XML_STATUS_ERROR)
-+    xml_failure(g_parser);
++START_TEST(test_suspend_resume_internal_entity_issue_629) {
++  const char *const text
++      = "<!DOCTYPE a [<!ENTITY e '<!--COMMENT-->a'>]><a>&e;<b>\n"
++        "<"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
++        "/>"
++        "</b></a>";
++  const size_t firstChunkSizeBytes = 54;
 +
-+  if ((uint32_t)(uintptr_t)XML_GetUserData(g_parser) != 0)
-+    fail("Element declaration model regression detected");
-+}
-+END_TEST
-+
- /* Test foreign DTD handling */
- START_TEST(test_set_foreign_dtd) {
-   const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n";
-@@ -3860,6 +3937,30 @@
- }
- END_TEST
- 
-+/* Test for signed integer overflow CVE-2022-23852 */
-+#if defined(XML_CONTEXT_BYTES)
-+START_TEST(test_get_buffer_3_overflow) {
 +  XML_Parser parser = XML_ParserCreate(NULL);
++  XML_SetUserData(parser, parser);
++  XML_SetCommentHandler(parser, suspending_comment_handler);
 +
-+  const char *const text = "\n";
-+  const int expectedKeepValue = (int)strlen(text);
-+
-+  assert(parser != NULL);
-+  // After this call, variable "keep" in XML_GetBuffer will
-+  // have value expectedKeepValue
-+  if (XML_Parse(parser, text, (int)strlen(text), XML_FALSE /* isFinal */)
-+      == XML_STATUS_ERROR)
++  if (XML_Parse(parser, text, (int)firstChunkSizeBytes, XML_FALSE)
++      != XML_STATUS_SUSPENDED)
++    xml_failure(parser);
++  if (XML_ResumeParser(parser) != XML_STATUS_OK)
++    xml_failure(parser);
++  if (XML_Parse(parser, text + firstChunkSizeBytes,
++                (int)(strlen(text) - firstChunkSizeBytes), XML_TRUE)
++      != XML_STATUS_OK)
 +    xml_failure(parser);
-+
-+  assert(expectedKeepValue > 0);
-+  if (XML_GetBuffer(parser, INT_MAX - expectedKeepValue + 1) != NULL)
-+    fail("enlarging buffer not failed");
-+
 +  XML_ParserFree(parser);
 +}
 +END_TEST
-+#endif // defined(XML_CONTEXT_BYTES)
-+
- /* Test position information macros */
- START_TEST(test_byte_info_at_end) {
-   const char *text = "<doc></doc>";
-@@ -5987,6 +6088,107 @@
- }
- END_TEST
- 
-+START_TEST(test_utf8_in_start_tags) {
-+  struct test_case {
-+    bool goodName;
-+    bool goodNameStart;
-+    const char *tagName;
-+  };
-+
-+  // The idea with the tests below is this:
-+  // We want to cover 1-, 2- and 3-byte sequences, 4-byte sequences
-+  // go to isNever and are hence not a concern.
-+  //
-+  // We start with a character that is a valid name character
-+  // (or even name-start character, see XML 1.0r4 spec) and then we flip
-+  // single bits at places where (1) the result leaves the UTF-8 encoding 
space
-+  // and (2) we stay in the same n-byte sequence family.
-+  //
-+  // The flipped bits are highlighted in angle brackets in comments,
-+  // e.g. "[<1>011 1001]" means we had [0011 1001] but we now flipped
-+  // the most significant bit to 1 to leave UTF-8 encoding space.
-+  struct test_case cases[] = {
-+      // 1-byte UTF-8: [0xxx xxxx]
-+      {true, true, "\x3A"},   // [0011 1010] = ASCII colon ':'
-+      {false, false, "\xBA"}, // [<1>011 1010]
-+      {true, false, "\x39"},  // [0011 1001] = ASCII nine '9'
-+      {false, false, "\xB9"}, // [<1>011 1001]
-+
-+      // 2-byte UTF-8: [110x xxxx] [10xx xxxx]
-+      {true, true, "\xDB\xA5"},   // [1101 1011] [1010 0101] =
-+                                  // Arabic small waw U+06E5
-+      {false, false, "\x9B\xA5"}, // [1<0>01 1011] [1010 0101]
-+      {false, false, "\xDB\x25"}, // [1101 1011] [<0>010 0101]
-+      {false, false, "\xDB\xE5"}, // [1101 1011] [1<1>10 0101]
-+      {true, false, "\xCC\x81"},  // [1100 1100] [1000 0001] =
-+                                  // combining char U+0301
-+      {false, false, "\x8C\x81"}, // [1<0>00 1100] [1000 0001]
-+      {false, false, "\xCC\x01"}, // [1100 1100] [<0>000 0001]
-+      {false, false, "\xCC\xC1"}, // [1100 1100] [1<1>00 0001]
-+
-+      // 3-byte UTF-8: [1110 xxxx] [10xx xxxx] [10xxxxxx]
-+      {true, true, "\xE0\xA4\x85"},   // [1110 0000] [1010 0100] [1000 0101] =
-+                                      // Devanagari Letter A U+0905
-+      {false, false, "\xA0\xA4\x85"}, // [1<0>10 0000] [1010 0100] [1000 0101]
-+      {false, false, "\xE0\x24\x85"}, // [1110 0000] [<0>010 0100] [1000 0101]
-+      {false, false, "\xE0\xE4\x85"}, // [1110 0000] [1<1>10 0100] [1000 0101]
-+      {false, false, "\xE0\xA4\x05"}, // [1110 0000] [1010 0100] [<0>000 0101]
-+      {false, false, "\xE0\xA4\xC5"}, // [1110 0000] [1010 0100] [1<1>00 0101]
-+      {true, false, "\xE0\xA4\x81"},  // [1110 0000] [1010 0100] [1000 0001] =
-+                                      // combining char U+0901
-+      {false, false, "\xA0\xA4\x81"}, // [1<0>10 0000] [1010 0100] [1000 0001]
-+      {false, false, "\xE0\x24\x81"}, // [1110 0000] [<0>010 0100] [1000 0001]
-+      {false, false, "\xE0\xE4\x81"}, // [1110 0000] [1<1>10 0100] [1000 0001]
-+      {false, false, "\xE0\xA4\x01"}, // [1110 0000] [1010 0100] [<0>000 0001]
-+      {false, false, "\xE0\xA4\xC1"}, // [1110 0000] [1010 0100] [1<1>00 0001]
-+  };
-+  const bool atNameStart[] = {true, false};
-+
-+  size_t i = 0;
-+  char doc[1024];
-+  size_t failCount = 0;
-+
-+  for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
-+    size_t j = 0;
-+    for (; j < sizeof(atNameStart) / sizeof(atNameStart[0]); j++) {
-+      const bool expectedSuccess
-+          = atNameStart[j] ? cases[i].goodNameStart : cases[i].goodName;
-+      XML_Parser parser = XML_ParserCreate(NULL);
-+      enum XML_Status status;
-+      bool success;
-+      sprintf(doc, "<%s%s><!--", atNameStart[j] ? "" : "a", cases[i].tagName);
-+
-+      status
-+          = XML_Parse(parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
-+
-+      success = true;
-+      if ((status == XML_STATUS_OK) != expectedSuccess) {
-+        success = false;
-+      }
-+      if ((status == XML_STATUS_ERROR)
-+          && (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)) {
-+        success = false;
-+      }
-+
-+      if (! success) {
-+        fprintf(
-+            stderr,
-+            "FAIL case %2u (%sat name start, %u-byte sequence, error code 
%d)\n",
-+            (unsigned)i + 1u, atNameStart[j] ? "    " : "not ",
-+            (unsigned)strlen(cases[i].tagName), XML_GetErrorCode(parser));
-+        failCount++;
-+      }
-+
-+      XML_ParserFree(parser);
-+    }
-+  }
-+
-+  if (failCount > 0) {
-+    fail("UTF-8 regression detected");
-+  }
-+}
-+END_TEST
-+
- /* Test trailing spaces in elements are accepted */
- static void XMLCALL
- record_element_end_handler(void *userData, const XML_Char *name) {
-@@ -6164,6 +6366,14 @@
- }
- END_TEST
- 
-+START_TEST(test_bad_doctype_utf8) {
-+  const char *text = "<!DOCTYPE \xDB\x25"
-+                     "doc><doc/>"; // [1101 1011] [<0>010 0101]
-+  expect_failure(text, XML_ERROR_INVALID_TOKEN,
-+                 "Invalid UTF-8 in DOCTYPE not faulted");
-+}
-+END_TEST
 +
- START_TEST(test_bad_doctype_utf16) {
-   const char text[] =
-       /* <!DOCTYPE doc [ \x06f2 ]><doc/>
-@@ -7209,6 +7419,37 @@
- }
- END_TEST
- 
-+START_TEST(test_ns_separator_in_uri) {
-+  struct test_case {
-+    enum XML_Status expectedStatus;
-+    const char *doc;
-+    XML_Char namesep;
-+  };
-+  struct test_case cases[] = {
-+      {XML_STATUS_OK, "<doc xmlns='one_two' />", XCS('\n')},
-+      {XML_STATUS_ERROR, "<doc xmlns='one&#x0A;two' />", XCS('\n')},
-+      {XML_STATUS_OK, "<doc xmlns='one:two' />", XCS(':')},
-+  };
-+
-+  size_t i = 0;
-+  size_t failCount = 0;
-+  for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
-+    XML_Parser parser = XML_ParserCreateNS(NULL, cases[i].namesep);
-+    XML_SetElementHandler(parser, dummy_start_element, dummy_end_element);
-+    if (XML_Parse(parser, cases[i].doc, (int)strlen(cases[i].doc),
-+                  /*isFinal*/ XML_TRUE)
-+        != cases[i].expectedStatus) {
-+      failCount++;
-+    }
-+    XML_ParserFree(parser);
-+  }
-+
-+  if (failCount) {
-+    fail("Namespace separator handling is broken");
-+  }
-+}
-+END_TEST
-+
- /* Control variable; the number of times duff_allocator() will successfully
-  * allocate */
- #define ALLOC_ALWAYS_SUCCEED (-1)
-@@ -7365,7 +7606,7 @@
-     fail("Version mismatch");
- 
- #if ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T)
--  if (xcstrcmp(version_text, XCS("expat_2.2.10"))) /* needs bump on releases 
*/
-+  if (xcstrcmp(version_text, XCS("expat_2.2.13"))) /* needs bump on releases 
*/
-     fail("XML_*_VERSION in expat.h out of sync?\n");
- #else
-   /* If we have XML_UNICODE defined but not XML_UNICODE_WCHAR_T
-@@ -9851,6 +10092,15 @@
- 
-   /* Try a parse before the start of the world */
-   /* (Exercises new code path) */
-+  if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
-+    fail("Pre-init XML_ParseBuffer not faulted");
-+  if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_BUFFER)
-+    fail("Pre-init XML_ParseBuffer faulted for wrong reason");
-+
-+  buffer = XML_GetBuffer(g_parser, 1 /* any small number greater than 0 */);
-+  if (buffer == NULL)
-+    fail("Could not acquire parse buffer");
-+
-   allocation_count = 0;
-   if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
-     fail("Pre-init XML_ParseBuffer not faulted");
-@@ -11231,6 +11481,401 @@
+ /* Test syntax error is caught at parse resumption */
+ START_TEST(test_resume_entity_with_syntax_error) {
+   const char *text = "<!DOCTYPE doc [\n"
+@@ -11231,6 +11304,381 @@
  }
  END_TEST
  
@@ -3539,16 +3160,6 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
 +
 +      /* CDATA */
 +      {"<e><![CDATA[one two three]]></e>", NULL, NULL, 0, filled_later},
-+      /* The following is the essence of this OSS-Fuzz finding:
-+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34302
-+         https://oss-fuzz.com/testcase-detail/4860575394955264
-+      */
-+      {"<!DOCTYPE r [\n"
-+       "<!ENTITY e \"111<![CDATA[2 <= 2]]>333\">\n"
-+       "]>\n"
-+       "<r>&e;</r>\n",
-+       NULL, NULL, sizeof(XML_Char) * strlen("111<![CDATA[2 <= 2]]>333"),
-+       filled_later},
 +
 +      /* Conditional sections */
 +      {"<!DOCTYPE r [\n"
@@ -3746,16 +3357,6 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
 +}
 +END_TEST
 +
-+static float
-+portableNAN() {
-+  return strtof("nan", NULL);
-+}
-+
-+static float
-+portableINFINITY() {
-+  return strtof("infinity", NULL);
-+}
-+
 +START_TEST(test_billion_laughs_attack_protection_api) {
 +  XML_Parser parserWithoutParent = XML_ParserCreate(NULL);
 +  XML_Parser parserWithParent
@@ -3774,7 +3375,7 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
 +      == XML_TRUE)
 +    fail("Call with non-root parser is NOT supposed to succeed");
 +  if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
-+          parserWithoutParent, portableNAN())
++          parserWithoutParent, NAN)
 +      == XML_TRUE)
 +    fail("Call with NaN limit is NOT supposed to succeed");
 +  if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
@@ -3796,7 +3397,7 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
 +      == XML_FALSE)
 +    fail("Call with positive limit >=1.0 is supposed to succeed");
 +  if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
-+          parserWithoutParent, portableINFINITY())
++          parserWithoutParent, INFINITY)
 +      == XML_FALSE)
 +    fail("Call with positive limit >=1.0 is supposed to succeed");
 +
@@ -3845,7 +3446,7 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
  static Suite *
  make_suite(void) {
    Suite *s = suite_create("basic");
-@@ -11239,6 +11884,9 @@
+@@ -11239,6 +11687,9 @@
    TCase *tc_misc = tcase_create("miscellaneous tests");
    TCase *tc_alloc = tcase_create("allocation tests");
    TCase *tc_nsalloc = tcase_create("namespace allocation tests");
@@ -3855,49 +3456,16 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
  
    suite_add_tcase(s, tc_basic);
    tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
-@@ -11325,6 +11973,7 @@
-   tcase_add_test(tc_basic, test_memory_allocation);
-   tcase_add_test(tc_basic, test_default_current);
-   tcase_add_test(tc_basic, test_dtd_elements);
-+  tcase_add_test(tc_basic, test_dtd_elements_nesting);
-   tcase_add_test__ifdef_xml_dtd(tc_basic, test_set_foreign_dtd);
-   tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_not_standalone);
-   tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_foreign_dtd);
-@@ -11353,6 +12002,9 @@
-   tcase_add_test(tc_basic, test_empty_parse);
-   tcase_add_test(tc_basic, test_get_buffer_1);
-   tcase_add_test(tc_basic, test_get_buffer_2);
-+#if defined(XML_CONTEXT_BYTES)
-+  tcase_add_test(tc_basic, test_get_buffer_3_overflow);
-+#endif
-   tcase_add_test(tc_basic, test_byte_info_at_end);
-   tcase_add_test(tc_basic, test_byte_info_at_error);
-   tcase_add_test(tc_basic, test_byte_info_at_cdata);
-@@ -11436,6 +12088,7 @@
-   tcase_add_test(tc_basic, test_ext_entity_utf8_non_bom);
-   tcase_add_test(tc_basic, test_utf8_in_cdata_section);
-   tcase_add_test(tc_basic, test_utf8_in_cdata_section_2);
-+  tcase_add_test(tc_basic, test_utf8_in_start_tags);
-   tcase_add_test(tc_basic, test_trailing_spaces_in_elements);
-   tcase_add_test(tc_basic, test_utf16_attribute);
-   tcase_add_test(tc_basic, test_utf16_second_attr);
-@@ -11444,6 +12097,7 @@
-   tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
-   tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
-   tcase_add_test(tc_basic, test_bad_doctype);
-+  tcase_add_test(tc_basic, test_bad_doctype_utf8);
-   tcase_add_test(tc_basic, test_bad_doctype_utf16);
-   tcase_add_test(tc_basic, test_bad_doctype_plus);
-   tcase_add_test(tc_basic, test_bad_doctype_star);
-@@ -11500,6 +12154,7 @@
-   tcase_add_test(tc_namespace, test_ns_utf16_doctype);
-   tcase_add_test(tc_namespace, test_ns_invalid_doctype);
-   tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
-+  tcase_add_test(tc_namespace, test_ns_separator_in_uri);
- 
-   suite_add_tcase(s, tc_misc);
-   tcase_add_checked_fixture(tc_misc, NULL, basic_teardown);
-@@ -11603,6 +12258,13 @@
+@@ -11387,6 +11838,8 @@
+   tcase_add_test(tc_basic, test_partial_char_in_epilog);
+   tcase_add_test(tc_basic, test_hash_collision);
+   tcase_add_test__ifdef_xml_dtd(tc_basic, 
test_suspend_resume_internal_entity);
++  tcase_add_test__ifdef_xml_dtd(tc_basic,
++                                
test_suspend_resume_internal_entity_issue_629);
+   tcase_add_test__ifdef_xml_dtd(tc_basic, 
test_resume_entity_with_syntax_error);
+   tcase_add_test__ifdef_xml_dtd(tc_basic, 
test_suspend_resume_parameter_entity);
+   tcase_add_test(tc_basic, test_restart_on_error);
+@@ -11603,6 +12056,13 @@
    tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
    tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
  
@@ -3911,21 +3479,9 @@ diff -ru misc/expat-2.2.10/tests/runtests.c 
misc/build/expat-2.2.10/tests/runtes
    return s;
  }
  
-diff -ru misc/expat-2.2.10/win32/expat.iss 
misc/build/expat-2.2.10/win32/expat.iss
---- misc/expat-2.2.10/win32/expat.iss  2020-10-03 17:14:57.000000000 +0200
-+++ misc/build/expat-2.2.10/win32/expat.iss    2022-03-09 20:25:36.720575719 
+0100
-@@ -4,7 +4,7 @@
- ; This script was contributed by Tim Peters.
- ; It was designed for Inno Setup 2.0.19 but works with later versions as well.
- 
--#define expatVer "2.2.10"
-+#define expatVer "2.2.13"
- 
- [Setup]
- AppName=Expat
-diff -ru misc/expat-2.2.10/xmlwf/Makefile.in 
misc/build/expat-2.2.10/xmlwf/Makefile.in
---- misc/expat-2.2.10/xmlwf/Makefile.in        2020-10-03 17:37:06.000000000 
+0200
-+++ misc/build/expat-2.2.10/xmlwf/Makefile.in  2022-03-05 12:25:27.583396678 
+0100
+diff -ru expat-2.2.10/xmlwf/Makefile.in 
misc/build/expat-2.2.10/xmlwf/Makefile.in
+--- expat-2.2.10/xmlwf/Makefile.in     2020-10-03 11:37:06.000000000 -0400
++++ misc/build/expat-2.2.10/xmlwf/Makefile.in  2021-07-18 18:17:02.826167000 
-0400
 @@ -1,7 +1,7 @@
 -# Makefile.in generated by automake 1.16.2 from Makefile.am.
 +# Makefile.in generated by automake 1.16.1 from Makefile.am.
@@ -3944,9 +3500,9 @@ diff -ru misc/expat-2.2.10/xmlwf/Makefile.in 
misc/build/expat-2.2.10/xmlwf/Makef
  sbindir = @sbindir@
  sharedstatedir = @sharedstatedir@
  srcdir = @srcdir@
-diff -ru misc/expat-2.2.10/xmlwf/xmltchar.h 
misc/build/expat-2.2.10/xmlwf/xmltchar.h
---- misc/expat-2.2.10/xmlwf/xmltchar.h 2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/xmlwf/xmltchar.h   2022-03-09 20:25:36.720575719 
+0100
+diff -ru expat-2.2.10/xmlwf/xmltchar.h misc/build/expat-2.2.10/xmlwf/xmltchar.h
+--- expat-2.2.10/xmlwf/xmltchar.h      2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/xmlwf/xmltchar.h   2021-07-18 17:21:48.697559000 
-0400
 @@ -54,6 +54,8 @@
  #  define tmain wmain
  #  define tremove _wremove
@@ -3963,9 +3519,9 @@ diff -ru misc/expat-2.2.10/xmlwf/xmltchar.h 
misc/build/expat-2.2.10/xmlwf/xmltch
 +#  define tcstof strtof
 +#  define tcstoull strtoull
  #endif /* not XML_UNICODE */
-diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c misc/build/expat-2.2.10/xmlwf/xmlwf.c
---- misc/expat-2.2.10/xmlwf/xmlwf.c    2020-09-25 19:47:39.000000000 +0200
-+++ misc/build/expat-2.2.10/xmlwf/xmlwf.c      2022-03-09 20:25:36.720575719 
+0100
+diff -ru expat-2.2.10/xmlwf/xmlwf.c misc/build/expat-2.2.10/xmlwf/xmlwf.c
+--- expat-2.2.10/xmlwf/xmlwf.c 2020-09-25 13:47:39.000000000 -0400
++++ misc/build/expat-2.2.10/xmlwf/xmlwf.c      2021-08-25 18:35:36.883146000 
-0400
 @@ -30,11 +30,15 @@
     USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
@@ -3997,43 +3553,7 @@ diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c 
misc/build/expat-2.2.10/xmlwf/xmlwf.c
  /* Structures for handler user data */
  typedef struct NotationList {
    struct NotationList *next;
-@@ -322,6 +334,13 @@
-   data->notationListHead = NULL;
- }
- 
-+static void
-+cleanupUserData(XmlwfUserData *userData) {
-+  free((void *)userData->currentDoctypeName);
-+  userData->currentDoctypeName = NULL;
-+  freeNotations(userData);
-+}
-+
- static int
- xcscmp(const XML_Char *xs, const XML_Char *xt) {
-   while (*xs != 0 && *xt != 0) {
-@@ -850,9 +869,10 @@
-        * $ xmlwf/xmlwf_helpgen.sh
-        */
-       /* clang-format off */
--      T("usage: %s [-s] [-n] [-p] [-x] [-e ENCODING] [-w] [-r] [-d 
DIRECTORY]\n")
--      T("             [-c | -m | -t] [-N]\n")
--      T("             [FILE [FILE ...]]\n")
-+      T("usage:\n")
-+      T("  %s [OPTIONS] [FILE ...]\n")
-+      T("  %s -h\n")
-+      T("  %s -v\n")
-       T("\n")
-       T("xmlwf - Determines if an XML document is well-formed\n")
-       T("\n")
-@@ -867,6 +887,7 @@
-       T("  -e ENCODING   override any in-document [e]ncoding declaration\n")
-       T("  -w            enable support for [W]indows code pages\n")
-       T("  -r            disable memory-mapping and use normal file [r]ead IO 
calls instead\n")
-+      T("  -k            when processing multiple files, [k]eep processing 
after first file with error\n")
-       T("\n")
-       T("output control arguments:\n")
-       T("  -d DIRECTORY  output [d]estination directory\n")
-@@ -875,14 +896,27 @@
+@@ -875,6 +887,12 @@
        T("  -t            write no XML output for [t]iming of plain parsing\n")
        T("  -N            enable adding doctype and [n]otation declarations\n")
        T("\n")
@@ -4046,23 +3566,7 @@ diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c 
misc/build/expat-2.2.10/xmlwf/xmlwf.c
        T("info arguments:\n")
        T("  -h            show this [h]elp message and exit\n")
        T("  -v            show program's [v]ersion number and exit\n")
-       T("\n")
-+      T("exit status:\n")
-+      T("  0             the input files are well-formed and the output (if 
requested) was written successfully\n")
-+      T("  1             could not allocate data structures, signals a 
serious problem with execution environment\n")
-+      T("  2             one or more input files were not well-formed\n")
-+      T("  3             could not create an output file\n")
-+      T("  4             command-line argument error\n")
-+      T("\n")
-       T("xmlwf of libexpat is software libre, licensed under the MIT 
license.\n")
-       T("Please report bugs at https://github.com/libexpat/libexpat/issues.  
Thank you!\n")
-       , /* clang-format on */
--      prog);
-+      prog, prog, prog);
-   exit(rc);
- }
- 
-@@ -891,6 +925,19 @@
+@@ -891,6 +909,19 @@
  int wmain(int argc, XML_Char **argv);
  #endif
  
@@ -4082,56 +3586,22 @@ diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c 
misc/build/expat-2.2.10/xmlwf/xmlwf.c
  int
  tmain(int argc, XML_Char **argv) {
    int i, j;
-@@ -902,6 +949,13 @@
+@@ -902,6 +933,11 @@
    int useNamespaces = 0;
    int requireStandalone = 0;
    int requiresNotations = 0;
-+  int continueOnError = 0;
 +
 +  float attackMaximumAmplification = -1.0f; /* signaling "not set" */
 +  unsigned long long attackThresholdBytes;
 +  XML_Bool attackThresholdGiven = XML_FALSE;
 +
-+  int exitCode = XMLWF_EXIT_SUCCESS;
    enum XML_ParamEntityParsing paramEntityParsing
        = XML_PARAM_ENTITY_PARSING_NEVER;
    int useStdin = 0;
-@@ -965,31 +1019,64 @@
-       j++;
-       break;
-     case T('d'):
--      if (argv[i][j + 1] == T('\0')) {
--        if (++i == argc)
--          usage(argv[0], 2);
--        outputDir = argv[i];
--      } else
--        outputDir = argv[i] + j + 1;
--      i++;
--      j = 0;
-+      XMLWF_SHIFT_ARG_INTO(outputDir, argc, argv, i, j);
-       break;
-     case T('e'):
--      if (argv[i][j + 1] == T('\0')) {
--        if (++i == argc)
--          usage(argv[0], 2);
--        encoding = argv[i];
--      } else
--        encoding = argv[i] + j + 1;
--      i++;
--      j = 0;
-+      XMLWF_SHIFT_ARG_INTO(encoding, argc, argv, i, j);
-       break;
-     case T('h'):
--      usage(argv[0], 0);
-+      usage(argv[0], XMLWF_EXIT_SUCCESS);
-       return 0;
+@@ -990,6 +1026,49 @@
      case T('v'):
        showVersion(argv[0]);
        return 0;
-+    case T('k'):
-+      continueOnError = 1;
-+      j++;
-+      break;
 +    case T('a'): {
 +      const XML_Char *valueText = NULL;
 +      XMLWF_SHIFT_ARG_INTO(valueText, argc, argv, i, j);
@@ -4178,23 +3648,10 @@ diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c 
misc/build/expat-2.2.10/xmlwf/xmlwf.c
      case T('\0'):
        if (j > 1) {
          i++;
-@@ -998,7 +1085,7 @@
-       }
-       /* fall through */
-     default:
--      usage(argv[0], 2);
-+      usage(argv[0], XMLWF_EXIT_USAGE_ERROR);
+@@ -1020,6 +1099,19 @@
+       exit(1);
      }
-   }
-   if (i == argc) {
-@@ -1017,7 +1104,22 @@
  
-     if (! parser) {
-       tperror(T("Could not instantiate parser"));
--      exit(1);
-+      exit(XMLWF_EXIT_INTERNAL_ERROR);
-+    }
-+
 +    if (attackMaximumAmplification != -1.0f) {
 +#ifdef XML_DTD
 +      XML_SetBillionLaughsAttackProtectionMaximumAmplification(
@@ -4205,55 +3662,15 @@ diff -ru misc/expat-2.2.10/xmlwf/xmlwf.c 
misc/build/expat-2.2.10/xmlwf/xmlwf.c
 +#ifdef XML_DTD
 +      XML_SetBillionLaughsAttackProtectionActivationThreshold(
 +          parser, attackThresholdBytes);
-+#else
-+      (void)attackThresholdBytes; // silence -Wunused-but-set-variable
 +#endif
-     }
- 
++    }
++
      if (requireStandalone)
-@@ -1053,7 +1155,7 @@
-                                    * sizeof(XML_Char));
-       if (! outName) {
-         tperror(T("Could not allocate memory"));
--        exit(1);
-+        exit(XMLWF_EXIT_INTERNAL_ERROR);
-       }
-       tcscpy(outName, outputDir);
-       tcscat(outName, delim);
-@@ -1061,7 +1163,14 @@
-       userData.fp = tfopen(outName, T("wb"));
-       if (! userData.fp) {
-         tperror(outName);
--        exit(3);
-+        exitCode = XMLWF_EXIT_OUTPUT_ERROR;
-+        free(outName);
-+        XML_ParserFree(parser);
-+        if (continueOnError) {
-+          continue;
-+        } else {
-+          break;
-+        }
-       }
-       setvbuf(userData.fp, NULL, _IOFBF, 16384);
- #ifdef XML_UNICODE
-@@ -1123,8 +1232,12 @@
-     }
-     XML_ParserFree(parser);
-     if (! result) {
--      exit(2);
-+      exitCode = XMLWF_EXIT_NOT_WELLFORMED;
-+      cleanupUserData(&userData);
-+      if (! continueOnError) {
-+        break;
-+      }
-     }
-   }
--  return 0;
-+  return exitCode;
- }
-diff -ru misc/expat-2.2.10/xmlwf/xmlwf_helpgen.py 
misc/build/expat-2.2.10/xmlwf/xmlwf_helpgen.py
---- misc/expat-2.2.10/xmlwf/xmlwf_helpgen.py   2020-09-25 19:47:39.000000000 
+0200
-+++ misc/build/expat-2.2.10/xmlwf/xmlwf_helpgen.py     2022-03-05 
12:25:27.583396678 +0100
+       XML_SetNotStandaloneHandler(parser, notStandalone);
+     XML_SetParamEntityParsing(parser, paramEntityParsing);
+diff -ru expat-2.2.10/xmlwf/xmlwf_helpgen.py 
misc/build/expat-2.2.10/xmlwf/xmlwf_helpgen.py
+--- expat-2.2.10/xmlwf/xmlwf_helpgen.py        2020-09-25 13:47:39.000000000 
-0400
++++ misc/build/expat-2.2.10/xmlwf/xmlwf_helpgen.py     2021-07-18 
17:21:48.697559000 -0400
 @@ -57,6 +57,14 @@
  output_mode.add_argument('-t', action='store_true', help='write no XML output 
for [t]iming of plain parsing')
  output_related.add_argument('-N', action='store_true', help='enable adding 
doctype and [n]otation declarations')

Reply via email to