Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package expat for openSUSE:Factory checked 
in at 2022-02-23 16:25:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/expat (Old)
 and      /work/SRC/openSUSE:Factory/.expat.new.1958 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "expat"

Wed Feb 23 16:25:34 2022 rev:66 rq:956337 version:2.4.6

Changes:
--------
--- /work/SRC/openSUSE:Factory/expat/expat.changes      2022-02-02 
22:40:01.424097128 +0100
+++ /work/SRC/openSUSE:Factory/.expat.new.1958/expat.changes    2022-02-23 
16:25:36.843507036 +0100
@@ -1,0 +2,52 @@
+Sun Feb 20 19:48:53 UTC 2022 - David Anes <david.a...@suse.com>
+
+- update to 2.4.6 (bsc#1196168, CVE-2022-25313):
+  * Bug fixes:
+    - Fix a regression introduced by the fix for CVE-2022-25313
+      in release 2.4.5 that affects applications that (1)
+      call function XML_SetElementDeclHandler and (2) are
+      parsing XML that contains nested element declarations
+      (e.g. "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>").
+    - Version info bumped from 9:5:8 to 9:6:8;
+      see https://verbump.de/ for what these numbers do.
+
+-------------------------------------------------------------------
+Sat Feb 19 09:21:21 UTC 2022 - David Anes <david.a...@suse.com>
+
+- update to 2.4.5 (bsc#1196171, bsc#1196169, bsc#1196168, 
+  bsc#1196026, bsc#1196025):
+    * Security fixes:
+      - CVE-2022-25235 -- Passing malformed 2- and 3-byte UTF-8
+        sequences (e.g. from start tag names) to the XML
+        processing application on top of Expat can cause
+        arbitrary damage (e.g. code execution) depending
+        on how invalid UTF-8 is handled inside the XML
+        processor; validation was not their job but Expat's.
+        Exploits with code execution are known to exist.
+      - CVE-2022-25236 -- Passing (one or more) namespace separator
+        characters in "xmlns[:prefix]" attribute values
+        made Expat send malformed tag names to the XML
+        processor on top of Expat which can cause
+        arbitrary damage (e.g. code execution) depending
+        on such unexpectable cases are handled inside the XML
+        processor; validation was not their job but Expat's.
+        Exploits with code execution are known to exist.
+      - CVE-2022-25313 -- Fix stack exhaustion in doctype parsing
+        that could be triggered by e.g. a 2 megabytes
+        file with a large number of opening braces.
+        Expected impact is denial of service or potentially
+        arbitrary code execution.
+      - CVE-2022-25314 -- Fix integer overflow in function copyString;
+        only affects the encoding name parameter at parser creation
+        time which is often hardcoded (rather than user input),
+        takes a value in the gigabytes to trigger, and a 64-bit
+        machine.  Expected impact is denial of service.
+      - CVE-2022-25315 -- Fix integer overflow in function storeRawNames;
+        needs input in the gigabytes and a 64-bit machine.
+        Expected impact is denial of service or potentially
+        arbitrary code execution.
+    * Other changes:
+      - Version info bumped from 9:4:8 to 9:5:8;
+        see https://verbump.de/ for what these numbers do
+
+-------------------------------------------------------------------

Old:
----
  expat-2.4.4.tar.xz
  expat-2.4.4.tar.xz.asc

New:
----
  expat-2.4.6.tar.xz
  expat-2.4.6.tar.xz.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ expat.spec ++++++
--- /var/tmp/diff_new_pack.dbheSA/_old  2022-02-23 16:25:37.475507058 +0100
+++ /var/tmp/diff_new_pack.dbheSA/_new  2022-02-23 16:25:37.483507059 +0100
@@ -16,9 +16,9 @@
 #
 
 
-%global unversion 2_4_4
+%global unversion 2_4_6
 Name:           expat
-Version:        2.4.4
+Version:        2.4.6
 Release:        0
 Summary:        XML Parser Toolkit
 License:        MIT

++++++ expat-2.4.4.tar.xz -> expat-2.4.6.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/CMake.README new/expat-2.4.6/CMake.README
--- old/expat-2.4.4/CMake.README        2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/CMake.README        2022-02-20 18:02:05.000000000 +0100
@@ -3,25 +3,25 @@
 The cmake based buildsystem for expat works on Windows (cygwin, mingw, Visual
 Studio) and should work on all other platform cmake supports.
 
-Assuming ~/expat-2.4.4 is the source directory of expat, add a subdirectory
+Assuming ~/expat-2.4.6 is the source directory of expat, add a subdirectory
 build and change into that directory:
-~/expat-2.4.4$ mkdir build && cd build
-~/expat-2.4.4/build$
+~/expat-2.4.6$ mkdir build && cd build
+~/expat-2.4.6/build$
 
 From that directory, call cmake first, then call make, make test and
 make install in the usual way:
-~/expat-2.4.4/build$ cmake ..
+~/expat-2.4.6/build$ cmake ..
 -- The C compiler identification is GNU
 -- The CXX compiler identification is GNU
 ....
 -- Configuring done
 -- Generating done
--- Build files have been written to: /home/patrick/expat-2.4.4/build
+-- Build files have been written to: /home/patrick/expat-2.4.6/build
 
 If you want to specify the install location for your files, append
 -DCMAKE_INSTALL_PREFIX=/your/install/path to the cmake call.
 
-~/expat-2.4.4/build$ make && make test && make install
+~/expat-2.4.6/build$ make && make test && make install
 Scanning dependencies of target expat
 [  5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o
 [ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/CMakeLists.txt 
new/expat-2.4.6/CMakeLists.txt
--- old/expat-2.4.4/CMakeLists.txt      2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/CMakeLists.txt      2022-02-20 18:02:05.000000000 +0100
@@ -64,7 +64,7 @@
 
 project(expat
     VERSION
-        2.4.4
+        2.4.6
     LANGUAGES
         C
 )
@@ -408,7 +408,7 @@
 endif()
 
 set(LIBCURRENT 9)   # sync
-set(LIBREVISION 4)  # with
+set(LIBREVISION 6)  # with
 set(LIBAGE 8)       # configure.ac!
 math(EXPR LIBCURRENT_MINUS_AGE "${LIBCURRENT} - ${LIBAGE}")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/Changes new/expat-2.4.6/Changes
--- old/expat-2.4.4/Changes     2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/Changes     2022-02-20 18:02:05.000000000 +0100
@@ -2,6 +2,69 @@
       https://github.com/libexpat/libexpat/labels/help%20wanted
       If you can help, please get in touch.  Thanks!
 
+Release 2.4.6 Sun February 20 2022
+        Bug fixes:
+            #566  Fix a regression introduced by the fix for CVE-2022-25313
+                    in release 2.4.5 that affects applications that (1)
+                    call function XML_SetElementDeclHandler and (2) are
+                    parsing XML that contains nested element declarations
+                    (e.g. "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>").
+
+        Other changes:
+       #567 #568  Version info bumped from 9:5:8 to 9:6:8;
+                    see https://verbump.de/ for what these numbers do
+
+        Special thanks to:
+            Matt Sergeant
+            Samanta Navarro
+            Sergei Trofimovich
+                 and
+            NixOS
+            Perl XML::Parser
+
+Release 2.4.5 Fri February 18 2022
+        Security fixes:
+            #562  CVE-2022-25235 -- Passing malformed 2- and 3-byte UTF-8
+                    sequences (e.g. from start tag names) to the XML
+                    processing application on top of Expat can cause
+                    arbitrary damage (e.g. code execution) depending
+                    on how invalid UTF-8 is handled inside the XML
+                    processor; validation was not their job but Expat's.
+                    Exploits with code execution are known to exist.
+            #561  CVE-2022-25236 -- Passing (one or more) namespace separator
+                    characters in "xmlns[:prefix]" attribute values
+                    made Expat send malformed tag names to the XML
+                    processor on top of Expat which can cause
+                    arbitrary damage (e.g. code execution) depending
+                    on such unexpectable cases are handled inside the XML
+                    processor; validation was not their job but Expat's.
+                    Exploits with code execution are known to exist.
+            #558  CVE-2022-25313 -- Fix stack exhaustion in doctype parsing
+                    that could be triggered by e.g. a 2 megabytes
+                    file with a large number of opening braces.
+                    Expected impact is denial of service or potentially
+                    arbitrary code execution.
+            #560  CVE-2022-25314 -- Fix integer overflow in function 
copyString;
+                    only affects the encoding name parameter at parser creation
+                    time which is often hardcoded (rather than user input),
+                    takes a value in the gigabytes to trigger, and a 64-bit
+                    machine.  Expected impact is denial of service.
+            #559  CVE-2022-25315 -- Fix integer overflow in function 
storeRawNames;
+                    needs input in the gigabytes and a 64-bit machine.
+                    Expected impact is denial of service or potentially
+                    arbitrary code execution.
+
+        Other changes:
+       #557 #564  Version info bumped from 9:4:8 to 9:5:8;
+                    see https://verbump.de/ for what these numbers do
+
+        Special thanks to:
+            Ivan Fratric
+            Samanta Navarro
+                 and
+            Google Project Zero
+            JetBrains
+
 Release 2.4.4 Sun January 30 2022
         Security fixes:
             #550  CVE-2022-23852 -- Fix signed integer overflow
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/README.md new/expat-2.4.6/README.md
--- old/expat-2.4.4/README.md   2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/README.md   2022-02-20 18:02:05.000000000 +0100
@@ -5,7 +5,7 @@
 [![Downloads 
GitHub](https://img.shields.io/github/downloads/libexpat/libexpat/total?label=Downloads%20GitHub)](https://github.com/libexpat/libexpat/releases)
 
 
-# Expat, Release 2.4.4
+# Expat, Release 2.4.6
 
 This is Expat, a C library for parsing XML, started by
 [James Clark](https://en.wikipedia.org/wiki/James_Clark_%28programmer%29) in 
1997.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/configure new/expat-2.4.6/configure
--- old/expat-2.4.4/configure   2022-01-30 01:11:25.000000000 +0100
+++ new/expat-2.4.6/configure   2022-02-20 18:04:16.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for expat 2.4.4.
+# Generated by GNU Autoconf 2.71 for expat 2.4.6.
 #
 # Report bugs to <expat-b...@libexpat.org>.
 #
@@ -621,8 +621,8 @@
 # Identity of this package.
 PACKAGE_NAME='expat'
 PACKAGE_TARNAME='expat'
-PACKAGE_VERSION='2.4.4'
-PACKAGE_STRING='expat 2.4.4'
+PACKAGE_VERSION='2.4.6'
+PACKAGE_STRING='expat 2.4.6'
 PACKAGE_BUGREPORT='expat-b...@libexpat.org'
 PACKAGE_URL=''
 
@@ -1414,7 +1414,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures expat 2.4.4 to adapt to many kinds of systems.
+\`configure' configures expat 2.4.6 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1485,7 +1485,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of expat 2.4.4:";;
+     short | recursive ) echo "Configuration of expat 2.4.6:";;
    esac
   cat <<\_ACEOF
 
@@ -1619,7 +1619,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-expat configure 2.4.4
+expat configure 2.4.6
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2250,7 +2250,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by expat $as_me 2.4.4, which was
+It was created by expat $as_me 2.4.6, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3817,7 +3817,7 @@
 
 # Define the identity of the package.
  PACKAGE='expat'
- VERSION='2.4.4'
+ VERSION='2.4.6'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -3924,7 +3924,7 @@
 
 
 LIBCURRENT=9   # sync
-LIBREVISION=4  # with
+LIBREVISION=6  # with
 LIBAGE=8       # CMakeLists.txt!
 
 ac_config_headers="$ac_config_headers expat_config.h"
@@ -20227,7 +20227,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by expat $as_me 2.4.4, which was
+This file was extended by expat $as_me 2.4.6, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20295,7 +20295,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-expat config.status 2.4.4
+expat config.status 2.4.6
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/configure.ac new/expat-2.4.6/configure.ac
--- old/expat-2.4.4/configure.ac        2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/configure.ac        2022-02-20 18:02:05.000000000 +0100
@@ -82,7 +82,7 @@
 dnl
 
 LIBCURRENT=9   # sync
-LIBREVISION=4  # with
+LIBREVISION=6  # with
 LIBAGE=8       # CMakeLists.txt!
 
 AC_CONFIG_HEADERS([expat_config.h])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/doc/Makefile.am 
new/expat-2.4.6/doc/Makefile.am
--- old/expat-2.4.4/doc/Makefile.am     2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/doc/Makefile.am     2022-02-20 04:52:37.000000000 +0100
@@ -6,7 +6,7 @@
 #                      \___/_/\_\ .__/ \__,_|\__|
 #                               |_| XML parser
 #
-# Copyright (c) 2017-2021 Sebastian Pipping <sebast...@pipping.org>
+# Copyright (c) 2017-2022 Sebastian Pipping <sebast...@pipping.org>
 # Copyright (c) 2017      Stephen Groat <step...@groat.us>
 # Copyright (c) 2017      Joe Orton <jor...@redhat.com>
 # Licensed under the MIT license:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/doc/Makefile.in 
new/expat-2.4.6/doc/Makefile.in
--- old/expat-2.4.4/doc/Makefile.in     2022-01-30 01:11:25.000000000 +0100
+++ new/expat-2.4.6/doc/Makefile.in     2022-02-20 18:04:17.000000000 +0100
@@ -22,7 +22,7 @@
 #                      \___/_/\_\ .__/ \__,_|\__|
 #                               |_| XML parser
 #
-# Copyright (c) 2017-2021 Sebastian Pipping <sebast...@pipping.org>
+# Copyright (c) 2017-2022 Sebastian Pipping <sebast...@pipping.org>
 # Copyright (c) 2017      Stephen Groat <step...@groat.us>
 # Copyright (c) 2017      Joe Orton <jor...@redhat.com>
 # Licensed under the MIT license:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/doc/reference.html 
new/expat-2.4.6/doc/reference.html
--- old/expat-2.4.4/doc/reference.html  2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/doc/reference.html  2022-02-20 18:02:05.000000000 +0100
@@ -49,7 +49,7 @@
   <div>
     <h1>
       The Expat XML Parser
-      <small>Release 2.4.4</small>
+      <small>Release 2.4.6</small>
     </h1>
   </div>
 <div class="content">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/doc/xmlwf.1 new/expat-2.4.6/doc/xmlwf.1
--- old/expat-2.4.4/doc/xmlwf.1 2022-01-30 01:11:31.000000000 +0100
+++ new/expat-2.4.6/doc/xmlwf.1 2022-02-20 18:04:23.000000000 +0100
@@ -5,7 +5,7 @@
 \\$2 \(la\\$1\(ra\\$3
 ..
 .if \n(.g .mso www.tmac
-.TH XMLWF 1 "January 30, 2022" "" ""
+.TH XMLWF 1 "February 20, 2022" "" ""
 .SH NAME
 xmlwf \- Determines if an XML document is well-formed
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/doc/xmlwf.xml 
new/expat-2.4.6/doc/xmlwf.xml
--- old/expat-2.4.4/doc/xmlwf.xml       2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/doc/xmlwf.xml       2022-02-20 18:02:05.000000000 +0100
@@ -21,7 +21,7 @@
           "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"; [
   <!ENTITY dhfirstname "<firstname>Scott</firstname>">
   <!ENTITY dhsurname   "<surname>Bronson</surname>">
-  <!ENTITY dhdate      "<date>January 30, 2022</date>">
+  <!ENTITY dhdate      "<date>February 20, 2022</date>">
   <!-- Please adjust this^^ date whenever cutting a new release. -->
   <!ENTITY dhsection   "<manvolnum>1</manvolnum>">
   <!ENTITY dhemail     "<email>bron...@rinspin.com</email>">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/examples/elements.c 
new/expat-2.4.6/examples/elements.c
--- old/expat-2.4.4/examples/elements.c 2022-01-29 22:35:57.000000000 +0100
+++ new/expat-2.4.6/examples/elements.c 2022-02-18 20:20:00.000000000 +0100
@@ -13,7 +13,7 @@
    Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
    Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2004-2006 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2016-2019 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Copyright (c) 2019      Zhongyuan Zhou <zhouzhongy...@huawei.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/examples/outline.c 
new/expat-2.4.6/examples/outline.c
--- old/expat-2.4.4/examples/outline.c  2022-01-29 22:35:57.000000000 +0100
+++ new/expat-2.4.6/examples/outline.c  2022-02-18 20:20:00.000000000 +0100
@@ -10,7 +10,7 @@
 
    Copyright (c) 2000      Clark Cooper <coope...@users.sourceforge.net>
    Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2005-2006 Karl Waclawek <k...@waclawek.net>
    Copyright (c) 2016-2019 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/expat_config.h 
new/expat-2.4.6/expat_config.h
--- old/expat-2.4.4/expat_config.h      2022-01-30 01:11:31.000000000 +0100
+++ new/expat-2.4.6/expat_config.h      2022-02-20 18:04:23.000000000 +0100
@@ -77,7 +77,7 @@
 #define PACKAGE_NAME "expat"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "expat 2.4.4"
+#define PACKAGE_STRING "expat 2.4.6"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "expat"
@@ -86,7 +86,7 @@
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "2.4.4"
+#define PACKAGE_VERSION "2.4.6"
 
 /* Define to 1 if all of the C90 standard headers exist (not just the ones
    required in a freestanding environment). This macro is provided for
@@ -94,7 +94,7 @@
 #define STDC_HEADERS 1
 
 /* Version number of package */
-#define VERSION "2.4.4"
+#define VERSION "2.4.6"
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/lib/expat.h new/expat-2.4.6/lib/expat.h
--- old/expat-2.4.4/lib/expat.h 2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/lib/expat.h 2022-02-20 18:02:05.000000000 +0100
@@ -1041,7 +1041,7 @@
 */
 #define XML_MAJOR_VERSION 2
 #define XML_MINOR_VERSION 4
-#define XML_MICRO_VERSION 4
+#define XML_MICRO_VERSION 6
 
 #ifdef __cplusplus
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/lib/xmlparse.c 
new/expat-2.4.6/lib/xmlparse.c
--- old/expat-2.4.4/lib/xmlparse.c      2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/lib/xmlparse.c      2022-02-20 18:02:05.000000000 +0100
@@ -1,4 +1,4 @@
-/* 2e2c8ce5f11a473d65ec313ab20ceee6afefb355f5405afc06e7204e2e41c8c0 (2.4.4+)
+/* a30d2613dcfdef81475a9d1a349134d2d42722172fdaa7d5bb12ed2aa74b9596 (2.4.6+)
                             __  __            _
                          ___\ \/ /_ __   __ _| |_
                         / _ \\  /| '_ \ / _` | __|
@@ -11,7 +11,7 @@
    Copyright (c) 2000-2006 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2001-2002 Greg Stein <gst...@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2009 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2009 Steven Solie <ste...@solie.ca>
    Copyright (c) 2016      Eric Rahm <er...@mozilla.com>
    Copyright (c) 2016-2022 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2016      Gaurav <g.gu...@samsung.com>
@@ -718,8 +718,7 @@
 
 XML_Parser XMLCALL
 XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) {
-  XML_Char tmp[2];
-  *tmp = nsSep;
+  XML_Char tmp[2] = {nsSep, 0};
   return XML_ParserCreate_MM(encodingName, NULL, tmp);
 }
 
@@ -1344,8 +1343,7 @@
      would be otherwise.
   */
   if (parser->m_ns) {
-    XML_Char tmp[2];
-    *tmp = parser->m_namespaceSeparator;
+    XML_Char tmp[2] = {parser->m_namespaceSeparator, 0};
     parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
   } else {
     parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
@@ -2563,6 +2561,7 @@
   while (tag) {
     int bufSize;
     int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
+    size_t rawNameLen;
     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
@@ -2574,7 +2573,11 @@
     /* For re-use purposes we need to ensure that the
        size of tag->buf is a multiple of sizeof(XML_Char).
     */
-    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+    rawNameLen = ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+    /* Detect and prevent integer overflow. */
+    if (rawNameLen > (size_t)INT_MAX - nameLen)
+      return XML_FALSE;
+    bufSize = nameLen + (int)rawNameLen;
     if (bufSize > tag->bufEnd - tag->buf) {
       char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
       if (temp == NULL)
@@ -3756,6 +3759,17 @@
     if (! mustBeXML && isXMLNS
         && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
       isXMLNS = XML_FALSE;
+
+    // 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;
@@ -7317,44 +7331,15 @@
   return next;
 }
 
-static void
-build_node(XML_Parser parser, int src_node, XML_Content *dest,
-           XML_Content **contpos, XML_Char **strpos) {
-  DTD *const dtd = parser->m_dtd; /* save one level of indirection */
-  dest->type = dtd->scaffold[src_node].type;
-  dest->quant = dtd->scaffold[src_node].quant;
-  if (dest->type == XML_CTYPE_NAME) {
-    const XML_Char *src;
-    dest->name = *strpos;
-    src = dtd->scaffold[src_node].name;
-    for (;;) {
-      *(*strpos)++ = *src;
-      if (! *src)
-        break;
-      src++;
-    }
-    dest->numchildren = 0;
-    dest->children = NULL;
-  } else {
-    unsigned int i;
-    int cn;
-    dest->numchildren = dtd->scaffold[src_node].childcnt;
-    dest->children = *contpos;
-    *contpos += dest->numchildren;
-    for (i = 0, cn = dtd->scaffold[src_node].firstchild; i < dest->numchildren;
-         i++, cn = dtd->scaffold[cn].nextsib) {
-      build_node(parser, cn, &(dest->children[i]), contpos, strpos);
-    }
-    dest->name = NULL;
-  }
-}
-
 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;
-  XML_Char *str;
+  XML_Char *str; /* the current string writing location */
 
   /* Detect and prevent integer overflow.
    * The preprocessor guard addresses the "always false" warning
@@ -7380,10 +7365,96 @@
   if (! ret)
     return NULL;
 
-  str = (XML_Char *)(&ret[dtd->scaffCount]);
-  cpos = &ret[1];
+  /* What follows is an iterative implementation (of what was previously done
+   * recursively in a dedicated function called "build_node".  The old 
recursive
+   * build_node could be forced into stack exhaustion from input as small as a
+   * few megabyte, and so that was a security issue.  Hence, a function call
+   * stack is avoided now by resolving recursion.)
+   *
+   * The iterative approach works as follows:
+   *
+   * - We have two writing pointers, both walking up the result array; one does
+   *   the work, the other creates "jobs" for its colleague to do, and leads
+   *   the way:
+   *
+   *   - The faster one, pointer jobDest, always leads and writes "what job
+   *     to do" by the other, once they reach that place in the
+   *     array: leader "jobDest" stores the source node array index (relative
+   *     to array dtd->scaffold) in field "numchildren".
+   *
+   *   - The slower one, pointer dest, looks at the value stored in the
+   *     "numchildren" field (which actually holds a source node array index
+   *     at that time) and puts the real data from dtd->scaffold in.
+   *
+   * - Before the loop starts, jobDest writes source array index 0
+   *   (where the root node is located) so that dest will have something to do
+   *   when it starts operation.
+   *
+   * - Whenever nodes with children are encountered, jobDest appends
+   *   them as new jobs, in order.  As a result, tree node siblings are
+   *   adjacent in the resulting array, for example:
+   *
+   *     [0] root, has two children
+   *       [1] first child of 0, has three children
+   *         [3] first child of 1, does not have children
+   *         [4] second child of 1, does not have children
+   *         [5] third child of 1, does not have children
+   *       [2] second child of 0, does not have children
+   *
+   *   Or (the same data) presented in flat array view:
+   *
+   *     [0] root, has two children
+   *
+   *     [1] first child of 0, has three children
+   *     [2] second child of 0, does not have children
+   *
+   *     [3] first child of 1, does not have children
+   *     [4] second child of 1, does not have children
+   *     [5] third child of 1, does not have children
+   *
+   * - The algorithm repeats until all target array indices have been 
processed.
+   */
+  XML_Content *dest = ret; /* tree node writing location, moves upwards */
+  XML_Content *const destLimit = &ret[dtd->scaffCount];
+  XML_Content *jobDest = ret; /* next free writing location in target array */
+  str = (XML_Char *)&ret[dtd->scaffCount];
+
+  /* Add the starting job, the root node (index 0) of the source tree  */
+  (jobDest++)->numchildren = 0;
+
+  for (; dest < destLimit; dest++) {
+    /* Retrieve source tree array index from job storage */
+    const int src_node = (int)dest->numchildren;
+
+    /* Convert item */
+    dest->type = dtd->scaffold[src_node].type;
+    dest->quant = dtd->scaffold[src_node].quant;
+    if (dest->type == XML_CTYPE_NAME) {
+      const XML_Char *src;
+      dest->name = str;
+      src = dtd->scaffold[src_node].name;
+      for (;;) {
+        *str++ = *src;
+        if (! *src)
+          break;
+        src++;
+      }
+      dest->numchildren = 0;
+      dest->children = NULL;
+    } else {
+      unsigned int i;
+      int cn;
+      dest->name = NULL;
+      dest->numchildren = dtd->scaffold[src_node].childcnt;
+      dest->children = jobDest;
+
+      /* Append scaffold indices of children to array */
+      for (i = 0, cn = dtd->scaffold[src_node].firstchild;
+           i < dest->numchildren; i++, cn = dtd->scaffold[cn].nextsib)
+        (jobDest++)->numchildren = (unsigned int)cn;
+    }
+  }
 
-  build_node(parser, 0, ret, &cpos, &str);
   return ret;
 }
 
@@ -7412,7 +7483,7 @@
 
 static XML_Char *
 copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
-  int charsRequired = 0;
+  size_t charsRequired = 0;
   XML_Char *result;
 
   /* First determine how long the string is */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/lib/xmlrole.c 
new/expat-2.4.6/lib/xmlrole.c
--- old/expat-2.4.4/lib/xmlrole.c       2022-01-29 22:35:58.000000000 +0100
+++ new/expat-2.4.6/lib/xmlrole.c       2022-02-18 20:20:00.000000000 +0100
@@ -11,7 +11,7 @@
    Copyright (c) 2002      Greg Stein <gst...@users.sourceforge.net>
    Copyright (c) 2002-2006 Karl Waclawek <k...@waclawek.net>
    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
-   Copyright (c) 2005-2009 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2009 Steven Solie <ste...@solie.ca>
    Copyright (c) 2016-2021 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Copyright (c) 2019      David Loffredo <loffr...@steptools.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/lib/xmltok.c new/expat-2.4.6/lib/xmltok.c
--- old/expat-2.4.4/lib/xmltok.c        2022-01-29 22:35:58.000000000 +0100
+++ new/expat-2.4.6/lib/xmltok.c        2022-02-20 04:52:37.000000000 +0100
@@ -11,8 +11,8 @@
    Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2002      Greg Stein <gst...@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2009 Steven Solie <sso...@users.sourceforge.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebast...@pipping.org>
+   Copyright (c) 2005-2009 Steven Solie <ste...@solie.ca>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2016      Pascal Cuoq <c...@trust-in-soft.com>
    Copyright (c) 2016      Don Lewis <truck...@apache.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
@@ -98,11 +98,6 @@
         + ((((byte)[1]) & 3) << 1) + ((((byte)[2]) >> 5) & 1)]                 
\
    & (1u << (((byte)[2]) & 0x1F)))
 
-#define UTF8_GET_NAMING(pages, p, n)                                           
\
-  ((n) == 2                                                                    
\
-       ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p))                   
\
-       : ((n) == 3 ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) : 0))
-
 /* Detection of invalid UTF-8 sequences is based on Table 3.1B
    of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
    with the additional restriction of not allowing the Unicode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/lib/xmltok_impl.c 
new/expat-2.4.6/lib/xmltok_impl.c
--- old/expat-2.4.4/lib/xmltok_impl.c   2022-01-29 22:35:58.000000000 +0100
+++ new/expat-2.4.6/lib/xmltok_impl.c   2022-02-20 04:52:37.000000000 +0100
@@ -10,7 +10,7 @@
    Copyright (c) 2000      Clark Cooper <coope...@users.sourceforge.net>
    Copyright (c) 2002      Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebast...@pipping.org>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Copyright (c) 2018      Benjamin Peterson <benja...@python.org>
    Copyright (c) 2018      Anton Maklakov <antmak....@gmail.com>
@@ -69,7 +69,7 @@
   case BT_LEAD##n:                                                             
\
     if (end - ptr < n)                                                         
\
       return XML_TOK_PARTIAL_CHAR;                                             
\
-    if (! IS_NAME_CHAR(enc, ptr, n)) {                                         
\
+    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         
\
       *nextTokPtr = ptr;                                                       
\
       return XML_TOK_INVALID;                                                  
\
     }                                                                          
\
@@ -98,7 +98,7 @@
   case BT_LEAD##n:                                                             
\
     if (end - ptr < n)                                                         
\
       return XML_TOK_PARTIAL_CHAR;                                             
\
-    if (! IS_NMSTRT_CHAR(enc, ptr, n)) {                                       
\
+    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       
\
       *nextTokPtr = ptr;                                                       
\
       return XML_TOK_INVALID;                                                  
\
     }                                                                          
\
@@ -1142,6 +1142,10 @@
   case BT_LEAD##n:                                                             
\
     if (end - ptr < n)                                                         
\
       return XML_TOK_PARTIAL_CHAR;                                             
\
+    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        
\
+      *nextTokPtr = ptr;                                                       
\
+      return XML_TOK_INVALID;                                                  
\
+    }                                                                          
\
     if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         
\
       ptr += n;                                                                
\
       tok = XML_TOK_NAME;                                                      
\
@@ -1270,7 +1274,7 @@
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         
\
   case BT_LEAD##n:                                                             
\
-    ptr += n;                                                                  
\
+    ptr += n; /* NOTE: The encoding has already been validated. */             
\
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1339,7 +1343,7 @@
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         
\
   case BT_LEAD##n:                                                             
\
-    ptr += n;                                                                  
\
+    ptr += n; /* NOTE: The encoding has already been validated. */             
\
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1518,7 +1522,7 @@
       state = inName;                                                          
\
     }
 #  define LEAD_CASE(n)                                                         
\
-  case BT_LEAD##n:                                                             
\
+  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        
\
     START_NAME ptr += (n - MINBPC(enc));                                       
\
     break;
       LEAD_CASE(2)
@@ -1730,7 +1734,7 @@
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         
\
   case BT_LEAD##n:                                                             
\
-    ptr += n;                                                                  
\
+    ptr += n; /* NOTE: The encoding has already been validated. */             
\
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1775,7 +1779,7 @@
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         
\
   case BT_LEAD##n:                                                             
\
-    ptr += n;                                                                  
\
+    ptr += n; /* NOTE: The encoding has already been validated. */             
\
     pos->columnNumber++;                                                       
\
     break;
       LEAD_CASE(2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/tests/benchmark/benchmark.c 
new/expat-2.4.6/tests/benchmark/benchmark.c
--- old/expat-2.4.4/tests/benchmark/benchmark.c 2022-01-29 22:35:59.000000000 
+0100
+++ new/expat-2.4.6/tests/benchmark/benchmark.c 2022-02-18 20:20:00.000000000 
+0100
@@ -7,7 +7,7 @@
                                  |_| XML parser
 
    Copyright (c) 2003-2006 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2017      Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Licensed under the MIT license:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/tests/runtests.c 
new/expat-2.4.6/tests/runtests.c
--- old/expat-2.4.4/tests/runtests.c    2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/tests/runtests.c    2022-02-20 18:02:05.000000000 +0100
@@ -8,7 +8,7 @@
 
    Copyright (c) 2001-2006 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2003      Greg Stein <gst...@users.sourceforge.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2005-2012 Karl Waclawek <k...@waclawek.net>
    Copyright (c) 2016-2022 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017-2018 Rhodri James <rho...@wildebeest.org.uk>
@@ -2664,6 +2664,82 @@
 }
 END_TEST
 
+static void XMLCALL
+element_decl_check_model(void *userData, const XML_Char *name,
+                         XML_Content *model) {
+  UNUSED_P(userData);
+  uint32_t errorFlags = 0;
+
+  /* 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);
+}
+
+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);
+
+  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";
@@ -5998,6 +6074,105 @@
 }
 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;
+      sprintf(doc, "<%s%s><!--", atNameStart[j] ? "" : "a", cases[i].tagName);
+      XML_Parser parser = XML_ParserCreate(NULL);
+
+      const enum XML_Status status
+          = XML_Parse(parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
+
+      bool 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) {
@@ -6175,6 +6350,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/>
@@ -7220,6 +7403,35 @@
 }
 END_TEST
 
+START_TEST(test_ns_separator_in_uri) {
+  struct test_case {
+    enum XML_Status expectedStatus;
+    const char *doc;
+  };
+  struct test_case cases[] = {
+      {XML_STATUS_OK, "<doc xmlns='one_two' />"},
+      {XML_STATUS_ERROR, "<doc xmlns='one&#x0A;two' />"},
+  };
+
+  size_t i = 0;
+  size_t failCount = 0;
+  for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
+    XML_Parser parser = XML_ParserCreateNS(NULL, '\n');
+    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)
@@ -7376,7 +7588,7 @@
     fail("Version mismatch");
 
 #if ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T)
-  if (xcstrcmp(version_text, XCS("expat_2.4.4"))) /* needs bump on releases */
+  if (xcstrcmp(version_text, XCS("expat_2.4.6"))) /* 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
@@ -11727,6 +11939,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);
@@ -11841,6 +12054,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);
@@ -11849,6 +12063,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);
@@ -11905,6 +12120,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);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/win32/expat.iss 
new/expat-2.4.6/win32/expat.iss
--- old/expat-2.4.4/win32/expat.iss     2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/win32/expat.iss     2022-02-20 18:02:05.000000000 +0100
@@ -36,7 +36,7 @@
 ; OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 ; USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-#define expatVer "2.4.4"
+#define expatVer "2.4.6"
 
 [Setup]
 AppName=Expat
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/xmlwf/xmlfile.c 
new/expat-2.4.6/xmlwf/xmlfile.c
--- old/expat-2.4.4/xmlwf/xmlfile.c     2022-01-29 22:36:00.000000000 +0100
+++ new/expat-2.4.6/xmlwf/xmlfile.c     2022-02-18 20:20:00.000000000 +0100
@@ -10,7 +10,7 @@
    Copyright (c) 2000      Clark Cooper <coope...@users.sourceforge.net>
    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2004-2006 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2016-2021 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Copyright (c) 2019      David Loffredo <loffr...@steptools.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/expat-2.4.4/xmlwf/xmlwf.c 
new/expat-2.4.6/xmlwf/xmlwf.c
--- old/expat-2.4.4/xmlwf/xmlwf.c       2022-01-30 01:09:44.000000000 +0100
+++ new/expat-2.4.6/xmlwf/xmlwf.c       2022-02-19 23:21:16.000000000 +0100
@@ -10,7 +10,7 @@
    Copyright (c) 2000      Clark Cooper <coope...@users.sourceforge.net>
    Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdr...@users.sourceforge.net>
    Copyright (c) 2004-2009 Karl Waclawek <k...@waclawek.net>
-   Copyright (c) 2005-2007 Steven Solie <sso...@users.sourceforge.net>
+   Copyright (c) 2005-2007 Steven Solie <ste...@solie.ca>
    Copyright (c) 2016-2022 Sebastian Pipping <sebast...@pipping.org>
    Copyright (c) 2017      Rhodri James <rho...@wildebeest.org.uk>
    Copyright (c) 2019      David Loffredo <loffr...@steptools.com>

Reply via email to