xref: /AOO41X/main/expat/expat-2.5.0.patch (revision 9ceaae4ac874e67ba241b9574474495deea69fc7)
1*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/lib/makefile.mk misc/build/expat-2.5.0/lib/makefile.mk
2*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/lib/makefile.mk	2023-02-06 23:22:07.391327553 +0100
3*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/lib/makefile.mk	2023-02-06 23:22:40.584115842 +0100
4*9ceaae4aSArrigo Marchiori@@ -1,1 +1,79 @@
5*9ceaae4aSArrigo Marchiori-dummy
6*9ceaae4aSArrigo Marchiori+#**************************************************************
7*9ceaae4aSArrigo Marchiori+#
8*9ceaae4aSArrigo Marchiori+#  Licensed to the Apache Software Foundation (ASF) under one
9*9ceaae4aSArrigo Marchiori+#  or more contributor license agreements.  See the NOTICE file
10*9ceaae4aSArrigo Marchiori+#  distributed with this work for additional information
11*9ceaae4aSArrigo Marchiori+#  regarding copyright ownership.  The ASF licenses this file
12*9ceaae4aSArrigo Marchiori+#  to you under the Apache License, Version 2.0 (the
13*9ceaae4aSArrigo Marchiori+#  "License"); you may not use this file except in compliance
14*9ceaae4aSArrigo Marchiori+#  with the License.  You may obtain a copy of the License at
15*9ceaae4aSArrigo Marchiori+#
16*9ceaae4aSArrigo Marchiori+#    http://www.apache.org/licenses/LICENSE-2.0
17*9ceaae4aSArrigo Marchiori+#
18*9ceaae4aSArrigo Marchiori+#  Unless required by applicable law or agreed to in writing,
19*9ceaae4aSArrigo Marchiori+#  software distributed under the License is distributed on an
20*9ceaae4aSArrigo Marchiori+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21*9ceaae4aSArrigo Marchiori+#  KIND, either express or implied.  See the License for the
22*9ceaae4aSArrigo Marchiori+#  specific language governing permissions and limitations
23*9ceaae4aSArrigo Marchiori+#  under the License.
24*9ceaae4aSArrigo Marchiori+#
25*9ceaae4aSArrigo Marchiori+#**************************************************************
26*9ceaae4aSArrigo Marchiori+PRJ=..$/..$/..$/..$/..
27*9ceaae4aSArrigo Marchiori+
28*9ceaae4aSArrigo Marchiori+PRJNAME=expat
29*9ceaae4aSArrigo Marchiori+TARGET=expat
30*9ceaae4aSArrigo Marchiori+LIBTARGET=NO
31*9ceaae4aSArrigo Marchiori+EXTERNAL_WARNINGS_NOT_ERRORS=TRUE
32*9ceaae4aSArrigo Marchiori+
33*9ceaae4aSArrigo Marchiori+# --- Settings -----------------------------------------------------
34*9ceaae4aSArrigo Marchiori+.INCLUDE :  settings.mk
35*9ceaae4aSArrigo Marchiori+# --- Files --------------------------------------------------------
36*9ceaae4aSArrigo Marchiori+
37*9ceaae4aSArrigo Marchiori+CFLAGS+=-I..
38*9ceaae4aSArrigo Marchiori+
39*9ceaae4aSArrigo Marchiori+.IF "$(OS)"=="WNT"
40*9ceaae4aSArrigo Marchiori+CDEFS+=-DWIN32
41*9ceaae4aSArrigo Marchiori+.ELSE
42*9ceaae4aSArrigo Marchiori+CDEFS+=-DHAVE_EXPAT_CONFIG_H
43*9ceaae4aSArrigo Marchiori+.ENDIF
44*9ceaae4aSArrigo Marchiori+
45*9ceaae4aSArrigo Marchiori+.IF "$(OS)"=="MACOSX" && "$(SYSBASE)"!=""
46*9ceaae4aSArrigo Marchiori+CDEFS+=-DHAVE_MEMMOVE -DHAVE_BCOPY
47*9ceaae4aSArrigo Marchiori+.ENDIF # "$(OS)"=="MACOSX"
48*9ceaae4aSArrigo Marchiori+
49*9ceaae4aSArrigo Marchiori+SECOND_BUILD=UNICODE
50*9ceaae4aSArrigo Marchiori+UNICODE_SLOFILES=$(SLO)$/xmlparse.obj
51*9ceaae4aSArrigo Marchiori+UNICODECDEFS+=-DXML_UNICODE
52*9ceaae4aSArrigo Marchiori+
53*9ceaae4aSArrigo Marchiori+LIB1ARCHIV=$(LB)$/libascii_$(TARGET)_xmlparse.a
54*9ceaae4aSArrigo Marchiori+LIB1TARGET=$(SLB)$/ascii_$(TARGET)_xmlparse.lib
55*9ceaae4aSArrigo Marchiori+LIB1OBJFILES=$(SLO)$/xmlparse.obj
56*9ceaae4aSArrigo Marchiori+
57*9ceaae4aSArrigo Marchiori+LIB2ARCHIV=$(LB)$/lib$(TARGET)_xmlparse.a
58*9ceaae4aSArrigo Marchiori+LIB2TARGET=$(SLB)$/$(TARGET)_xmlparse.lib
59*9ceaae4aSArrigo Marchiori+LIB2OBJFILES =$(REAL_UNICODE_SLOFILES)
60*9ceaae4aSArrigo Marchiori+
61*9ceaae4aSArrigo Marchiori+LIB3ARCHIV=$(LB)$/lib$(TARGET)_xmltok.a
62*9ceaae4aSArrigo Marchiori+LIB3TARGET=$(SLB)$/$(TARGET)_xmltok.lib
63*9ceaae4aSArrigo Marchiori+LIB3OBJFILES=$(SLO)$/xmlrole.obj $(SLO)$/xmltok.obj
64*9ceaae4aSArrigo Marchiori+
65*9ceaae4aSArrigo Marchiori+.IF "$(BUILD_X64)"!=""
66*9ceaae4aSArrigo Marchiori+# ---------------- X64 stuff special ---------------------
67*9ceaae4aSArrigo Marchiori+#  use UNICODE only because shell/shlxthandler
68*9ceaae4aSArrigo Marchiori+#  doesn't link against ascii_expat_xmlparse
69*9ceaae4aSArrigo Marchiori+#---------------------------------------------------------
70*9ceaae4aSArrigo Marchiori+SLOFILES_X64=$(SLO_X64)$/xmlparse.obj \
71*9ceaae4aSArrigo Marchiori+             $(SLO_X64)$/xmlrole.obj \
72*9ceaae4aSArrigo Marchiori+             $(SLO_X64)$/xmltok.obj
73*9ceaae4aSArrigo Marchiori+CDEFS_X64+=-DXML_UNICODE -DWIN32
74*9ceaae4aSArrigo Marchiori+CFLAGS_X64+=-I..
75*9ceaae4aSArrigo Marchiori+LIB1TARGET_X64=$(SLB_X64)$/$(TARGET)_xmlparse.lib
76*9ceaae4aSArrigo Marchiori+LIB1OBJFILES_X64=$(SLO_X64)$/xmlparse.obj
77*9ceaae4aSArrigo Marchiori+LIB2TARGET_X64=$(SLB_X64)$/$(TARGET)_xmltok.lib
78*9ceaae4aSArrigo Marchiori+LIB2OBJFILES_X64=$(SLO_X64)$/xmlrole.obj $(SLO_X64)$/xmltok.obj
79*9ceaae4aSArrigo Marchiori+.ENDIF # "$(BUILD_X64)"!=""
80*9ceaae4aSArrigo Marchiori+
81*9ceaae4aSArrigo Marchiori+# --- Targets ------------------------------------------------------
82*9ceaae4aSArrigo Marchiori+.INCLUDE :  set_wntx64.mk
83*9ceaae4aSArrigo Marchiori+.INCLUDE :	target.mk
84*9ceaae4aSArrigo Marchiori+.INCLUDE :  tg_wntx64.mk
85*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/Changes misc/build/expat-2.5.0/Changes
86*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/Changes	2022-10-25 17:09:08.000000000 +0200
87*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/Changes	2023-02-06 23:22:40.572115558 +0100
88*9ceaae4aSArrigo Marchiori@@ -2,6 +2,9 @@
89*9ceaae4aSArrigo Marchiori       https://github.com/libexpat/libexpat/labels/help%20wanted
90*9ceaae4aSArrigo Marchiori       If you can help, please get in touch.  Thanks!
91*9ceaae4aSArrigo Marchiori
92*9ceaae4aSArrigo Marchiori+Release 2.5.0-aoo Sat February 04 2023
93*9ceaae4aSArrigo Marchiori+        Adapted to AOO sources.
94*9ceaae4aSArrigo Marchiori+
95*9ceaae4aSArrigo Marchiori Release 2.5.0 Tue October 25 2022
96*9ceaae4aSArrigo Marchiori         Security fixes:
97*9ceaae4aSArrigo Marchiori   #616 #649 #650  CVE-2022-43680 -- Fix heap use-after-free after overeager
98*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/expat_config.h misc/build/expat-2.5.0/expat_config.h
99*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/expat_config.h	2022-10-25 17:34:58.000000000 +0200
100*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/expat_config.h	2023-02-06 23:22:40.604116318 +0100
101*9ceaae4aSArrigo Marchiori@@ -14,7 +14,7 @@
102*9ceaae4aSArrigo Marchiori /* #undef HAVE_ARC4RANDOM */
103*9ceaae4aSArrigo Marchiori
104*9ceaae4aSArrigo Marchiori /* Define to 1 if you have the `arc4random_buf' function. */
105*9ceaae4aSArrigo Marchiori-#define HAVE_ARC4RANDOM_BUF 1
106*9ceaae4aSArrigo Marchiori+/* #undef HAVE_ARC4RANDOM_BUF */
107*9ceaae4aSArrigo Marchiori
108*9ceaae4aSArrigo Marchiori /* Define to 1 if you have the <dlfcn.h> header file. */
109*9ceaae4aSArrigo Marchiori #define HAVE_DLFCN_H 1
110*9ceaae4aSArrigo Marchiori@@ -74,13 +74,13 @@
111*9ceaae4aSArrigo Marchiori #define PACKAGE "expat"
112*9ceaae4aSArrigo Marchiori
113*9ceaae4aSArrigo Marchiori /* Define to the address where bug reports for this package should be sent. */
114*9ceaae4aSArrigo Marchiori-#define PACKAGE_BUGREPORT "expat-bugs@libexpat.org"
115*9ceaae4aSArrigo Marchiori+#define PACKAGE_BUGREPORT "dev@openoffice.apache.org"
116*9ceaae4aSArrigo Marchiori
117*9ceaae4aSArrigo Marchiori /* Define to the full name of this package. */
118*9ceaae4aSArrigo Marchiori #define PACKAGE_NAME "expat"
119*9ceaae4aSArrigo Marchiori
120*9ceaae4aSArrigo Marchiori /* Define to the full name and version of this package. */
121*9ceaae4aSArrigo Marchiori-#define PACKAGE_STRING "expat 2.5.0"
122*9ceaae4aSArrigo Marchiori+#define PACKAGE_STRING "expat 2.5.0-aoo"
123*9ceaae4aSArrigo Marchiori
124*9ceaae4aSArrigo Marchiori /* Define to the one symbol short name of this package. */
125*9ceaae4aSArrigo Marchiori #define PACKAGE_TARNAME "expat"
126*9ceaae4aSArrigo Marchiori@@ -89,7 +89,7 @@
127*9ceaae4aSArrigo Marchiori #define PACKAGE_URL ""
128*9ceaae4aSArrigo Marchiori
129*9ceaae4aSArrigo Marchiori /* Define to the version of this package. */
130*9ceaae4aSArrigo Marchiori-#define PACKAGE_VERSION "2.5.0"
131*9ceaae4aSArrigo Marchiori+#define PACKAGE_VERSION "2.5.0-aoo"
132*9ceaae4aSArrigo Marchiori
133*9ceaae4aSArrigo Marchiori /* Define to 1 if all of the C90 standard headers exist (not just the ones
134*9ceaae4aSArrigo Marchiori    required in a freestanding environment). This macro is provided for
135*9ceaae4aSArrigo Marchiori@@ -97,7 +97,7 @@
136*9ceaae4aSArrigo Marchiori #define STDC_HEADERS 1
137*9ceaae4aSArrigo Marchiori
138*9ceaae4aSArrigo Marchiori /* Version number of package */
139*9ceaae4aSArrigo Marchiori-#define VERSION "2.5.0"
140*9ceaae4aSArrigo Marchiori+#define VERSION "2.5.0-aoo"
141*9ceaae4aSArrigo Marchiori
142*9ceaae4aSArrigo Marchiori /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
143*9ceaae4aSArrigo Marchiori    significant byte first (like Motorola and SPARC, unlike Intel). */
144*9ceaae4aSArrigo Marchiori@@ -119,8 +119,10 @@
145*9ceaae4aSArrigo Marchiori    point. */
146*9ceaae4aSArrigo Marchiori #define XML_CONTEXT_BYTES 1024
147*9ceaae4aSArrigo Marchiori
148*9ceaae4aSArrigo Marchiori+#if ! defined(_WIN32)
149*9ceaae4aSArrigo Marchiori /* Define to include code reading entropy from `/dev/urandom'. */
150*9ceaae4aSArrigo Marchiori #define XML_DEV_URANDOM 1
151*9ceaae4aSArrigo Marchiori+#endif
152*9ceaae4aSArrigo Marchiori
153*9ceaae4aSArrigo Marchiori /* Define to make parameter entity parsing functionality available. */
154*9ceaae4aSArrigo Marchiori #define XML_DTD 1
155*9ceaae4aSArrigo Marchiori@@ -128,6 +130,11 @@
156*9ceaae4aSArrigo Marchiori /* Define to make XML Namespaces functionality available. */
157*9ceaae4aSArrigo Marchiori #define XML_NS 1
158*9ceaae4aSArrigo Marchiori
159*9ceaae4aSArrigo Marchiori+/* Define to __FUNCTION__ or "" if `__func__' does not conform to ANSI C. */
160*9ceaae4aSArrigo Marchiori+#ifdef _MSC_VER
161*9ceaae4aSArrigo Marchiori+#  define __func__ __FUNCTION__
162*9ceaae4aSArrigo Marchiori+#endif
163*9ceaae4aSArrigo Marchiori+
164*9ceaae4aSArrigo Marchiori /* Define to empty if `const' does not conform to ANSI C. */
165*9ceaae4aSArrigo Marchiori /* #undef const */
166*9ceaae4aSArrigo Marchiori
167*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/lib/siphash.h misc/build/expat-2.5.0/lib/siphash.h
168*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/lib/siphash.h	2022-10-23 17:16:56.000000000 +0200
169*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/lib/siphash.h	2023-02-06 23:22:40.588115938 +0100
170*9ceaae4aSArrigo Marchiori@@ -99,7 +99,15 @@
171*9ceaae4aSArrigo Marchiori #define SIPHASH_H
172*9ceaae4aSArrigo Marchiori
173*9ceaae4aSArrigo Marchiori #include <stddef.h> /* size_t */
174*9ceaae4aSArrigo Marchiori-#include <stdint.h> /* uint64_t uint32_t uint8_t */
175*9ceaae4aSArrigo Marchiori+#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
176*9ceaae4aSArrigo Marchiori+/* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
177*9ceaae4aSArrigo Marchiori+typedef unsigned __int8 uint8_t;
178*9ceaae4aSArrigo Marchiori+typedef unsigned __int32 uint32_t;
179*9ceaae4aSArrigo Marchiori+typedef unsigned __int64 uint64_t;
180*9ceaae4aSArrigo Marchiori+#else
181*9ceaae4aSArrigo Marchiori+#  include <stdint.h> /* uint64_t uint32_t uint8_t */
182*9ceaae4aSArrigo Marchiori+#endif
183*9ceaae4aSArrigo Marchiori+
184*9ceaae4aSArrigo Marchiori
185*9ceaae4aSArrigo Marchiori /*
186*9ceaae4aSArrigo Marchiori  * Workaround to not require a C++11 compiler for using ULL suffix
187*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/lib/winconfig.h misc/build/expat-2.5.0/lib/winconfig.h
188*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/lib/winconfig.h	2022-10-24 18:32:55.000000000 +0200
189*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/lib/winconfig.h	2023-02-06 23:22:40.584115842 +0100
190*9ceaae4aSArrigo Marchiori@@ -42,4 +42,11 @@
191*9ceaae4aSArrigo Marchiori #include <memory.h>
192*9ceaae4aSArrigo Marchiori #include <string.h>
193*9ceaae4aSArrigo Marchiori
194*9ceaae4aSArrigo Marchiori+#  define XML_NS 1
195*9ceaae4aSArrigo Marchiori+#  define XML_DTD 1
196*9ceaae4aSArrigo Marchiori+#  define XML_CONTEXT_BYTES 1024
197*9ceaae4aSArrigo Marchiori+
198*9ceaae4aSArrigo Marchiori+/* we will assume all Windows platforms are little endian */
199*9ceaae4aSArrigo Marchiori+#  define BYTEORDER 1234
200*9ceaae4aSArrigo Marchiori+
201*9ceaae4aSArrigo Marchiori #endif /* ndef WINCONFIG_H */
202*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/lib/xmlparse.c misc/build/expat-2.5.0/lib/xmlparse.c
203*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/lib/xmlparse.c	2022-10-25 17:09:08.000000000 +0200
204*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/lib/xmlparse.c	2023-02-06 23:22:40.584115842 +0100
205*9ceaae4aSArrigo Marchiori@@ -60,8 +60,6 @@
206*9ceaae4aSArrigo Marchiori
207*9ceaae4aSArrigo Marchiori #define XML_BUILDING_EXPAT 1
208*9ceaae4aSArrigo Marchiori
209*9ceaae4aSArrigo Marchiori-#include <expat_config.h>
210*9ceaae4aSArrigo Marchiori-
211*9ceaae4aSArrigo Marchiori #if ! defined(_GNU_SOURCE)
212*9ceaae4aSArrigo Marchiori #  define _GNU_SOURCE 1 /* syscall prototype */
213*9ceaae4aSArrigo Marchiori #endif
214*9ceaae4aSArrigo Marchiori@@ -79,9 +77,19 @@
215*9ceaae4aSArrigo Marchiori #include <limits.h> /* UINT_MAX */
216*9ceaae4aSArrigo Marchiori #include <stdio.h>  /* fprintf */
217*9ceaae4aSArrigo Marchiori #include <stdlib.h> /* getenv, rand_s */
218*9ceaae4aSArrigo Marchiori-#include <stdint.h> /* uintptr_t */
219*9ceaae4aSArrigo Marchiori #include <math.h>   /* isnan */
220*9ceaae4aSArrigo Marchiori
221*9ceaae4aSArrigo Marchiori+#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
222*9ceaae4aSArrigo Marchiori+/* vs2008/9.0 and earlier lack stdint.h; _MSC_VER 1600 is vs2010/10.0 */
223*9ceaae4aSArrigo Marchiori+#  if defined(_WIN64)
224*9ceaae4aSArrigo Marchiori+typedef unsigned __int64 uintptr_t;
225*9ceaae4aSArrigo Marchiori+#  else
226*9ceaae4aSArrigo Marchiori+typedef unsigned __int32 uintptr_t;
227*9ceaae4aSArrigo Marchiori+#  endif
228*9ceaae4aSArrigo Marchiori+#else
229*9ceaae4aSArrigo Marchiori+#  include <stdint.h> /* uintptr_t */
230*9ceaae4aSArrigo Marchiori+#endif
231*9ceaae4aSArrigo Marchiori+
232*9ceaae4aSArrigo Marchiori #ifdef _WIN32
233*9ceaae4aSArrigo Marchiori #  define getpid GetCurrentProcessId
234*9ceaae4aSArrigo Marchiori #else
235*9ceaae4aSArrigo Marchiori@@ -94,7 +102,13 @@
236*9ceaae4aSArrigo Marchiori
237*9ceaae4aSArrigo Marchiori #ifdef _WIN32
238*9ceaae4aSArrigo Marchiori #  include "winconfig.h"
239*9ceaae4aSArrigo Marchiori+#include <float.h>
240*9ceaae4aSArrigo Marchiori+#ifndef isnan
241*9ceaae4aSArrigo Marchiori+#define isnan _isnan
242*9ceaae4aSArrigo Marchiori #endif
243*9ceaae4aSArrigo Marchiori+#else
244*9ceaae4aSArrigo Marchiori+#  include <expat_config.h>
245*9ceaae4aSArrigo Marchiori+#endif /* ndef _WIN32 */
246*9ceaae4aSArrigo Marchiori
247*9ceaae4aSArrigo Marchiori #include "ascii.h"
248*9ceaae4aSArrigo Marchiori #include "expat.h"
249*9ceaae4aSArrigo Marchiori@@ -720,7 +734,9 @@
250*9ceaae4aSArrigo Marchiori
251*9ceaae4aSArrigo Marchiori XML_Parser XMLCALL
252*9ceaae4aSArrigo Marchiori XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) {
253*9ceaae4aSArrigo Marchiori-  XML_Char tmp[2] = {nsSep, 0};
254*9ceaae4aSArrigo Marchiori+  XML_Char tmp[2];
255*9ceaae4aSArrigo Marchiori+  tmp[0] = nsSep;
256*9ceaae4aSArrigo Marchiori+  tmp[1] = 0;
257*9ceaae4aSArrigo Marchiori   return XML_ParserCreate_MM(encodingName, NULL, tmp);
258*9ceaae4aSArrigo Marchiori }
259*9ceaae4aSArrigo Marchiori
260*9ceaae4aSArrigo Marchiori@@ -1354,7 +1370,9 @@
261*9ceaae4aSArrigo Marchiori      would be otherwise.
262*9ceaae4aSArrigo Marchiori   */
263*9ceaae4aSArrigo Marchiori   if (parser->m_ns) {
264*9ceaae4aSArrigo Marchiori-    XML_Char tmp[2] = {parser->m_namespaceSeparator, 0};
265*9ceaae4aSArrigo Marchiori+    XML_Char tmp[2];
266*9ceaae4aSArrigo Marchiori+    tmp[0] = parser->m_namespaceSeparator;
267*9ceaae4aSArrigo Marchiori+    tmp[1] = 0;
268*9ceaae4aSArrigo Marchiori     parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
269*9ceaae4aSArrigo Marchiori   } else {
270*9ceaae4aSArrigo Marchiori     parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
271*9ceaae4aSArrigo Marchiori@@ -3469,6 +3487,8 @@
272*9ceaae4aSArrigo Marchiori   i = 0;
273*9ceaae4aSArrigo Marchiori   if (nPrefixes) {
274*9ceaae4aSArrigo Marchiori     int j; /* hash table index */
275*9ceaae4aSArrigo Marchiori+    unsigned int nsAttsSize;
276*9ceaae4aSArrigo Marchiori+    unsigned char oldNsAttsPower;
277*9ceaae4aSArrigo Marchiori     unsigned long version = parser->m_nsAttsVersion;
278*9ceaae4aSArrigo Marchiori
279*9ceaae4aSArrigo Marchiori     /* Detect and prevent invalid shift */
280*9ceaae4aSArrigo Marchiori@@ -3476,8 +3496,8 @@
281*9ceaae4aSArrigo Marchiori       return XML_ERROR_NO_MEMORY;
282*9ceaae4aSArrigo Marchiori     }
283*9ceaae4aSArrigo Marchiori
284*9ceaae4aSArrigo Marchiori-    unsigned int nsAttsSize = 1u << parser->m_nsAttsPower;
285*9ceaae4aSArrigo Marchiori-    unsigned char oldNsAttsPower = parser->m_nsAttsPower;
286*9ceaae4aSArrigo Marchiori+    nsAttsSize = 1u << parser->m_nsAttsPower;
287*9ceaae4aSArrigo Marchiori+    oldNsAttsPower = parser->m_nsAttsPower;
288*9ceaae4aSArrigo Marchiori     /* size of hash table must be at least 2 * (# of prefixed attributes) */
289*9ceaae4aSArrigo Marchiori     if ((nPrefixes << 1)
290*9ceaae4aSArrigo Marchiori         >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */
291*9ceaae4aSArrigo Marchiori@@ -3922,6 +3942,7 @@
292*9ceaae4aSArrigo Marchiori   if (parser->m_freeBindingList) {
293*9ceaae4aSArrigo Marchiori     b = parser->m_freeBindingList;
294*9ceaae4aSArrigo Marchiori     if (len > b->uriAlloc) {
295*9ceaae4aSArrigo Marchiori+      XML_Char *temp = NULL;
296*9ceaae4aSArrigo Marchiori       /* Detect and prevent integer overflow */
297*9ceaae4aSArrigo Marchiori       if (len > INT_MAX - EXPAND_SPARE) {
298*9ceaae4aSArrigo Marchiori         return XML_ERROR_NO_MEMORY;
299*9ceaae4aSArrigo Marchiori@@ -3937,7 +3958,7 @@
300*9ceaae4aSArrigo Marchiori       }
301*9ceaae4aSArrigo Marchiori #endif
302*9ceaae4aSArrigo Marchiori
303*9ceaae4aSArrigo Marchiori-      XML_Char *temp = (XML_Char *)REALLOC(
304*9ceaae4aSArrigo Marchiori+      temp = (XML_Char *)REALLOC(
305*9ceaae4aSArrigo Marchiori           parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE));
306*9ceaae4aSArrigo Marchiori       if (temp == NULL)
307*9ceaae4aSArrigo Marchiori         return XML_ERROR_NO_MEMORY;
308*9ceaae4aSArrigo Marchiori@@ -4638,11 +4659,6 @@
309*9ceaae4aSArrigo Marchiori          ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0'};
310*9ceaae4aSArrigo Marchiori   static const XML_Char enumValueSep[] = {ASCII_PIPE, '\0'};
311*9ceaae4aSArrigo Marchiori   static const XML_Char enumValueStart[] = {ASCII_LPAREN, '\0'};
312*9ceaae4aSArrigo Marchiori-
313*9ceaae4aSArrigo Marchiori-#ifndef XML_DTD
314*9ceaae4aSArrigo Marchiori-  UNUSED_P(account);
315*9ceaae4aSArrigo Marchiori-#endif
316*9ceaae4aSArrigo Marchiori-
317*9ceaae4aSArrigo Marchiori   /* save one level of indirection */
318*9ceaae4aSArrigo Marchiori   DTD *const dtd = parser->m_dtd;
319*9ceaae4aSArrigo Marchiori
320*9ceaae4aSArrigo Marchiori@@ -4650,6 +4666,10 @@
321*9ceaae4aSArrigo Marchiori   const char **eventEndPP;
322*9ceaae4aSArrigo Marchiori   enum XML_Content_Quant quant;
323*9ceaae4aSArrigo Marchiori
324*9ceaae4aSArrigo Marchiori+#ifndef XML_DTD
325*9ceaae4aSArrigo Marchiori+  UNUSED_P(account);
326*9ceaae4aSArrigo Marchiori+#endif
327*9ceaae4aSArrigo Marchiori+
328*9ceaae4aSArrigo Marchiori   if (enc == parser->m_encoding) {
329*9ceaae4aSArrigo Marchiori     eventPP = &parser->m_eventPtr;
330*9ceaae4aSArrigo Marchiori     eventEndPP = &parser->m_eventEndPtr;
331*9ceaae4aSArrigo Marchiori@@ -5290,12 +5310,13 @@
332*9ceaae4aSArrigo Marchiori       if (parser->m_prologState.level >= parser->m_groupSize) {
333*9ceaae4aSArrigo Marchiori         if (parser->m_groupSize) {
334*9ceaae4aSArrigo Marchiori           {
335*9ceaae4aSArrigo Marchiori+	    char *new_connector = NULL;
336*9ceaae4aSArrigo Marchiori             /* Detect and prevent integer overflow */
337*9ceaae4aSArrigo Marchiori             if (parser->m_groupSize > (unsigned int)(-1) / 2u) {
338*9ceaae4aSArrigo Marchiori               return XML_ERROR_NO_MEMORY;
339*9ceaae4aSArrigo Marchiori             }
340*9ceaae4aSArrigo Marchiori
341*9ceaae4aSArrigo Marchiori-            char *const new_connector = (char *)REALLOC(
342*9ceaae4aSArrigo Marchiori+            new_connector = (char *)REALLOC(
343*9ceaae4aSArrigo Marchiori                 parser, parser->m_groupConnector, parser->m_groupSize *= 2);
344*9ceaae4aSArrigo Marchiori             if (new_connector == NULL) {
345*9ceaae4aSArrigo Marchiori               parser->m_groupSize /= 2;
346*9ceaae4aSArrigo Marchiori@@ -5309,13 +5330,14 @@
347*9ceaae4aSArrigo Marchiori              * The preprocessor guard addresses the "always false" warning
348*9ceaae4aSArrigo Marchiori              * from -Wtype-limits on platforms where
349*9ceaae4aSArrigo Marchiori              * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
350*9ceaae4aSArrigo Marchiori+	    int *new_scaff_index = NULL;
351*9ceaae4aSArrigo Marchiori #if UINT_MAX >= SIZE_MAX
352*9ceaae4aSArrigo Marchiori             if (parser->m_groupSize > (size_t)(-1) / sizeof(int)) {
353*9ceaae4aSArrigo Marchiori               return XML_ERROR_NO_MEMORY;
354*9ceaae4aSArrigo Marchiori             }
355*9ceaae4aSArrigo Marchiori #endif
356*9ceaae4aSArrigo Marchiori
357*9ceaae4aSArrigo Marchiori-            int *const new_scaff_index = (int *)REALLOC(
358*9ceaae4aSArrigo Marchiori+            new_scaff_index = (int *)REALLOC(
359*9ceaae4aSArrigo Marchiori                 parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int));
360*9ceaae4aSArrigo Marchiori             if (new_scaff_index == NULL)
361*9ceaae4aSArrigo Marchiori               return XML_ERROR_NO_MEMORY;
362*9ceaae4aSArrigo Marchiori@@ -6404,13 +6426,14 @@
363*9ceaae4aSArrigo Marchiori       }
364*9ceaae4aSArrigo Marchiori     } else {
365*9ceaae4aSArrigo Marchiori       DEFAULT_ATTRIBUTE *temp;
366*9ceaae4aSArrigo Marchiori+      int count;
367*9ceaae4aSArrigo Marchiori
368*9ceaae4aSArrigo Marchiori       /* Detect and prevent integer overflow */
369*9ceaae4aSArrigo Marchiori       if (type->allocDefaultAtts > INT_MAX / 2) {
370*9ceaae4aSArrigo Marchiori         return 0;
371*9ceaae4aSArrigo Marchiori       }
372*9ceaae4aSArrigo Marchiori
373*9ceaae4aSArrigo Marchiori-      int count = type->allocDefaultAtts * 2;
374*9ceaae4aSArrigo Marchiori+      count = type->allocDefaultAtts * 2;
375*9ceaae4aSArrigo Marchiori
376*9ceaae4aSArrigo Marchiori       /* Detect and prevent integer overflow.
377*9ceaae4aSArrigo Marchiori        * The preprocessor guard addresses the "always false" warning
378*9ceaae4aSArrigo Marchiori@@ -7072,22 +7095,26 @@
379*9ceaae4aSArrigo Marchiori     /* check for overflow (table is half full) */
380*9ceaae4aSArrigo Marchiori     if (table->used >> (table->power - 1)) {
381*9ceaae4aSArrigo Marchiori       unsigned char newPower = table->power + 1;
382*9ceaae4aSArrigo Marchiori+      size_t newSize;
383*9ceaae4aSArrigo Marchiori+      unsigned long newMask;
384*9ceaae4aSArrigo Marchiori+      size_t tsize;
385*9ceaae4aSArrigo Marchiori+      NAMED **newV = NULL;
386*9ceaae4aSArrigo Marchiori
387*9ceaae4aSArrigo Marchiori       /* Detect and prevent invalid shift */
388*9ceaae4aSArrigo Marchiori       if (newPower >= sizeof(unsigned long) * 8 /* bits per byte */) {
389*9ceaae4aSArrigo Marchiori         return NULL;
390*9ceaae4aSArrigo Marchiori       }
391*9ceaae4aSArrigo Marchiori
392*9ceaae4aSArrigo Marchiori-      size_t newSize = (size_t)1 << newPower;
393*9ceaae4aSArrigo Marchiori-      unsigned long newMask = (unsigned long)newSize - 1;
394*9ceaae4aSArrigo Marchiori+      newSize = (size_t)1 << newPower;
395*9ceaae4aSArrigo Marchiori+      newMask = (unsigned long)newSize - 1;
396*9ceaae4aSArrigo Marchiori
397*9ceaae4aSArrigo Marchiori       /* Detect and prevent integer overflow */
398*9ceaae4aSArrigo Marchiori       if (newSize > (size_t)(-1) / sizeof(NAMED *)) {
399*9ceaae4aSArrigo Marchiori         return NULL;
400*9ceaae4aSArrigo Marchiori       }
401*9ceaae4aSArrigo Marchiori
402*9ceaae4aSArrigo Marchiori-      size_t tsize = newSize * sizeof(NAMED *);
403*9ceaae4aSArrigo Marchiori-      NAMED **newV = table->mem->malloc_fcn(tsize);
404*9ceaae4aSArrigo Marchiori+      tsize = newSize * sizeof(NAMED *);
405*9ceaae4aSArrigo Marchiori+      newV = table->mem->malloc_fcn(tsize);
406*9ceaae4aSArrigo Marchiori       if (! newV)
407*9ceaae4aSArrigo Marchiori         return NULL;
408*9ceaae4aSArrigo Marchiori       memset(newV, 0, tsize);
409*9ceaae4aSArrigo Marchiori@@ -7489,6 +7516,10 @@
410*9ceaae4aSArrigo Marchiori   DTD *const dtd = parser->m_dtd; /* save one level of indirection */
411*9ceaae4aSArrigo Marchiori   XML_Content *ret;
412*9ceaae4aSArrigo Marchiori   XML_Char *str; /* the current string writing location */
413*9ceaae4aSArrigo Marchiori+  size_t allocsize;
414*9ceaae4aSArrigo Marchiori+  XML_Content *dest = NULL;
415*9ceaae4aSArrigo Marchiori+  XML_Content *destLimit = NULL;
416*9ceaae4aSArrigo Marchiori+  XML_Content *jobDest = NULL;
417*9ceaae4aSArrigo Marchiori
418*9ceaae4aSArrigo Marchiori   /* Detect and prevent integer overflow.
419*9ceaae4aSArrigo Marchiori    * The preprocessor guard addresses the "always false" warning
420*9ceaae4aSArrigo Marchiori@@ -7507,7 +7538,7 @@
421*9ceaae4aSArrigo Marchiori     return NULL;
422*9ceaae4aSArrigo Marchiori   }
423*9ceaae4aSArrigo Marchiori
424*9ceaae4aSArrigo Marchiori-  const size_t allocsize = (dtd->scaffCount * sizeof(XML_Content)
425*9ceaae4aSArrigo Marchiori+  allocsize = (dtd->scaffCount * sizeof(XML_Content)
426*9ceaae4aSArrigo Marchiori                             + (dtd->contentStringLen * sizeof(XML_Char)));
427*9ceaae4aSArrigo Marchiori
428*9ceaae4aSArrigo Marchiori   ret = (XML_Content *)MALLOC(parser, allocsize);
429*9ceaae4aSArrigo Marchiori@@ -7563,9 +7594,9 @@
430*9ceaae4aSArrigo Marchiori    *
431*9ceaae4aSArrigo Marchiori    * - The algorithm repeats until all target array indices have been processed.
432*9ceaae4aSArrigo Marchiori    */
433*9ceaae4aSArrigo Marchiori-  XML_Content *dest = ret; /* tree node writing location, moves upwards */
434*9ceaae4aSArrigo Marchiori-  XML_Content *const destLimit = &ret[dtd->scaffCount];
435*9ceaae4aSArrigo Marchiori-  XML_Content *jobDest = ret; /* next free writing location in target array */
436*9ceaae4aSArrigo Marchiori+  dest = ret; /* tree node writing location, moves upwards */
437*9ceaae4aSArrigo Marchiori+  destLimit = &ret[dtd->scaffCount];
438*9ceaae4aSArrigo Marchiori+  jobDest = ret; /* next free writing location in target array */
439*9ceaae4aSArrigo Marchiori   str = (XML_Char *)&ret[dtd->scaffCount];
440*9ceaae4aSArrigo Marchiori
441*9ceaae4aSArrigo Marchiori   /* Add the starting job, the root node (index 0) of the source tree  */
442*9ceaae4aSArrigo Marchiori@@ -7670,13 +7701,14 @@
443*9ceaae4aSArrigo Marchiori static void
444*9ceaae4aSArrigo Marchiori accountingReportStats(XML_Parser originParser, const char *epilog) {
445*9ceaae4aSArrigo Marchiori   const XML_Parser rootParser = getRootParserOf(originParser, NULL);
446*9ceaae4aSArrigo Marchiori+  float amplificationFactor;
447*9ceaae4aSArrigo Marchiori   assert(! rootParser->m_parentParser);
448*9ceaae4aSArrigo Marchiori
449*9ceaae4aSArrigo Marchiori   if (rootParser->m_accounting.debugLevel < 1) {
450*9ceaae4aSArrigo Marchiori     return;
451*9ceaae4aSArrigo Marchiori   }
452*9ceaae4aSArrigo Marchiori
453*9ceaae4aSArrigo Marchiori-  const float amplificationFactor
454*9ceaae4aSArrigo Marchiori+  amplificationFactor
455*9ceaae4aSArrigo Marchiori       = accountingGetCurrentAmplification(rootParser);
456*9ceaae4aSArrigo Marchiori   fprintf(stderr,
457*9ceaae4aSArrigo Marchiori           "expat: Accounting(%p): Direct " EXPAT_FMT_ULL(
458*9ceaae4aSArrigo Marchiori@@ -7696,6 +7728,10 @@
459*9ceaae4aSArrigo Marchiori                      unsigned int levelsAwayFromRootParser, const char *before,
460*9ceaae4aSArrigo Marchiori                      const char *after, ptrdiff_t bytesMore, int source_line,
461*9ceaae4aSArrigo Marchiori                      enum XML_Account account) {
462*9ceaae4aSArrigo Marchiori+  const char ellipis[] = "[..]";
463*9ceaae4aSArrigo Marchiori+  const size_t ellipsisLength = sizeof(ellipis) /* because compile-time */ - 1;
464*9ceaae4aSArrigo Marchiori+  const unsigned int contextLength = 10;
465*9ceaae4aSArrigo Marchiori+  const char *walker = NULL;
466*9ceaae4aSArrigo Marchiori   assert(! rootParser->m_parentParser);
467*9ceaae4aSArrigo Marchiori
468*9ceaae4aSArrigo Marchiori   fprintf(stderr,
469*9ceaae4aSArrigo Marchiori@@ -7703,12 +7739,8 @@
470*9ceaae4aSArrigo Marchiori           bytesMore, (account == XML_ACCOUNT_DIRECT) ? "DIR" : "EXP",
471*9ceaae4aSArrigo Marchiori           levelsAwayFromRootParser, source_line, 10, "");
472*9ceaae4aSArrigo Marchiori
473*9ceaae4aSArrigo Marchiori-  const char ellipis[] = "[..]";
474*9ceaae4aSArrigo Marchiori-  const size_t ellipsisLength = sizeof(ellipis) /* because compile-time */ - 1;
475*9ceaae4aSArrigo Marchiori-  const unsigned int contextLength = 10;
476*9ceaae4aSArrigo Marchiori-
477*9ceaae4aSArrigo Marchiori   /* Note: Performance is of no concern here */
478*9ceaae4aSArrigo Marchiori-  const char *walker = before;
479*9ceaae4aSArrigo Marchiori+  walker = before;
480*9ceaae4aSArrigo Marchiori   if ((rootParser->m_accounting.debugLevel >= 3)
481*9ceaae4aSArrigo Marchiori       || (after - before)
482*9ceaae4aSArrigo Marchiori              <= (ptrdiff_t)(contextLength + ellipsisLength + contextLength)) {
483*9ceaae4aSArrigo Marchiori@@ -7732,6 +7764,14 @@
484*9ceaae4aSArrigo Marchiori accountingDiffTolerated(XML_Parser originParser, int tok, const char *before,
485*9ceaae4aSArrigo Marchiori                         const char *after, int source_line,
486*9ceaae4aSArrigo Marchiori                         enum XML_Account account) {
487*9ceaae4aSArrigo Marchiori+  unsigned int levelsAwayFromRootParser;
488*9ceaae4aSArrigo Marchiori+  XML_Parser rootParser;
489*9ceaae4aSArrigo Marchiori+  int isDirect;
490*9ceaae4aSArrigo Marchiori+  ptrdiff_t bytesMore;
491*9ceaae4aSArrigo Marchiori+  XmlBigCount *additionTarget = NULL;
492*9ceaae4aSArrigo Marchiori+  XmlBigCount countBytesOutput;
493*9ceaae4aSArrigo Marchiori+  float amplificationFactor;
494*9ceaae4aSArrigo Marchiori+  XML_Bool tolerated;
495*9ceaae4aSArrigo Marchiori   /* Note: We need to check the token type *first* to be sure that
496*9ceaae4aSArrigo Marchiori    *       we can even access variable <after>, safely.
497*9ceaae4aSArrigo Marchiori    *       E.g. for XML_TOK_NONE <after> may hold an invalid pointer. */
498*9ceaae4aSArrigo Marchiori@@ -7746,16 +7786,15 @@
499*9ceaae4aSArrigo Marchiori   if (account == XML_ACCOUNT_NONE)
500*9ceaae4aSArrigo Marchiori     return XML_TRUE; /* because these bytes have been accounted for, already */
501*9ceaae4aSArrigo Marchiori
502*9ceaae4aSArrigo Marchiori-  unsigned int levelsAwayFromRootParser;
503*9ceaae4aSArrigo Marchiori-  const XML_Parser rootParser
504*9ceaae4aSArrigo Marchiori+  rootParser
505*9ceaae4aSArrigo Marchiori       = getRootParserOf(originParser, &levelsAwayFromRootParser);
506*9ceaae4aSArrigo Marchiori   assert(! rootParser->m_parentParser);
507*9ceaae4aSArrigo Marchiori
508*9ceaae4aSArrigo Marchiori-  const int isDirect
509*9ceaae4aSArrigo Marchiori+  isDirect
510*9ceaae4aSArrigo Marchiori       = (account == XML_ACCOUNT_DIRECT) && (originParser == rootParser);
511*9ceaae4aSArrigo Marchiori-  const ptrdiff_t bytesMore = after - before;
512*9ceaae4aSArrigo Marchiori+  bytesMore = after - before;
513*9ceaae4aSArrigo Marchiori
514*9ceaae4aSArrigo Marchiori-  XmlBigCount *const additionTarget
515*9ceaae4aSArrigo Marchiori+  additionTarget
516*9ceaae4aSArrigo Marchiori       = isDirect ? &rootParser->m_accounting.countBytesDirect
517*9ceaae4aSArrigo Marchiori                  : &rootParser->m_accounting.countBytesIndirect;
518*9ceaae4aSArrigo Marchiori
519*9ceaae4aSArrigo Marchiori@@ -7764,12 +7803,12 @@
520*9ceaae4aSArrigo Marchiori     return XML_FALSE;
521*9ceaae4aSArrigo Marchiori   *additionTarget += bytesMore;
522*9ceaae4aSArrigo Marchiori
523*9ceaae4aSArrigo Marchiori-  const XmlBigCount countBytesOutput
524*9ceaae4aSArrigo Marchiori+  countBytesOutput
525*9ceaae4aSArrigo Marchiori       = rootParser->m_accounting.countBytesDirect
526*9ceaae4aSArrigo Marchiori         + rootParser->m_accounting.countBytesIndirect;
527*9ceaae4aSArrigo Marchiori-  const float amplificationFactor
528*9ceaae4aSArrigo Marchiori+  amplificationFactor
529*9ceaae4aSArrigo Marchiori       = accountingGetCurrentAmplification(rootParser);
530*9ceaae4aSArrigo Marchiori-  const XML_Bool tolerated
531*9ceaae4aSArrigo Marchiori+  tolerated
532*9ceaae4aSArrigo Marchiori       = (countBytesOutput < rootParser->m_accounting.activationThresholdBytes)
533*9ceaae4aSArrigo Marchiori         || (amplificationFactor
534*9ceaae4aSArrigo Marchiori             <= rootParser->m_accounting.maximumAmplificationFactor);
535*9ceaae4aSArrigo Marchiori@@ -7800,14 +7839,15 @@
536*9ceaae4aSArrigo Marchiori static void
537*9ceaae4aSArrigo Marchiori entityTrackingReportStats(XML_Parser rootParser, ENTITY *entity,
538*9ceaae4aSArrigo Marchiori                           const char *action, int sourceLine) {
539*9ceaae4aSArrigo Marchiori+  const char *entityName;
540*9ceaae4aSArrigo Marchiori   assert(! rootParser->m_parentParser);
541*9ceaae4aSArrigo Marchiori   if (rootParser->m_entity_stats.debugLevel < 1)
542*9ceaae4aSArrigo Marchiori     return;
543*9ceaae4aSArrigo Marchiori
544*9ceaae4aSArrigo Marchiori #  if defined(XML_UNICODE)
545*9ceaae4aSArrigo Marchiori-  const char *const entityName = "[..]";
546*9ceaae4aSArrigo Marchiori+  entityName = "[..]";
547*9ceaae4aSArrigo Marchiori #  else
548*9ceaae4aSArrigo Marchiori-  const char *const entityName = entity->name;
549*9ceaae4aSArrigo Marchiori+  entityName = entity->name;
550*9ceaae4aSArrigo Marchiori #  endif
551*9ceaae4aSArrigo Marchiori
552*9ceaae4aSArrigo Marchiori   fprintf(
553*9ceaae4aSArrigo Marchiori@@ -8387,14 +8427,17 @@
554*9ceaae4aSArrigo Marchiori static unsigned long
555*9ceaae4aSArrigo Marchiori getDebugLevel(const char *variableName, unsigned long defaultDebugLevel) {
556*9ceaae4aSArrigo Marchiori   const char *const valueOrNull = getenv(variableName);
557*9ceaae4aSArrigo Marchiori+  const char *value = NULL;
558*9ceaae4aSArrigo Marchiori+  char *afterValue = NULL;
559*9ceaae4aSArrigo Marchiori+  unsigned long debugLevel;
560*9ceaae4aSArrigo Marchiori   if (valueOrNull == NULL) {
561*9ceaae4aSArrigo Marchiori     return defaultDebugLevel;
562*9ceaae4aSArrigo Marchiori   }
563*9ceaae4aSArrigo Marchiori-  const char *const value = valueOrNull;
564*9ceaae4aSArrigo Marchiori+  value = valueOrNull;
565*9ceaae4aSArrigo Marchiori
566*9ceaae4aSArrigo Marchiori   errno = 0;
567*9ceaae4aSArrigo Marchiori-  char *afterValue = (char *)value;
568*9ceaae4aSArrigo Marchiori-  unsigned long debugLevel = strtoul(value, &afterValue, 10);
569*9ceaae4aSArrigo Marchiori+  afterValue = (char *)value;
570*9ceaae4aSArrigo Marchiori+  debugLevel = strtoul(value, &afterValue, 10);
571*9ceaae4aSArrigo Marchiori   if ((errno != 0) || (afterValue[0] != '\0')) {
572*9ceaae4aSArrigo Marchiori     errno = 0;
573*9ceaae4aSArrigo Marchiori     return defaultDebugLevel;
574*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/lib/xmltok.c misc/build/expat-2.5.0/lib/xmltok.c
575*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/lib/xmltok.c	2022-10-24 18:32:55.000000000 +0200
576*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/lib/xmltok.c	2023-02-06 23:22:40.588115938 +0100
577*9ceaae4aSArrigo Marchiori@@ -44,14 +44,22 @@
578*9ceaae4aSArrigo Marchiori    USE OR OTHER DEALINGS IN THE SOFTWARE.
579*9ceaae4aSArrigo Marchiori */
580*9ceaae4aSArrigo Marchiori
581*9ceaae4aSArrigo Marchiori-#include <expat_config.h>
582*9ceaae4aSArrigo Marchiori-
583*9ceaae4aSArrigo Marchiori #include <stddef.h>
584*9ceaae4aSArrigo Marchiori #include <string.h> /* memcpy */
585*9ceaae4aSArrigo Marchiori-#include <stdbool.h>
586*9ceaae4aSArrigo Marchiori+
587*9ceaae4aSArrigo Marchiori+#if defined(_MSC_VER) && (_MSC_VER <= 1700)
588*9ceaae4aSArrigo Marchiori+/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
589*9ceaae4aSArrigo Marchiori+#  define bool int
590*9ceaae4aSArrigo Marchiori+#  define false 0
591*9ceaae4aSArrigo Marchiori+#  define true 1
592*9ceaae4aSArrigo Marchiori+#else
593*9ceaae4aSArrigo Marchiori+#  include <stdbool.h>
594*9ceaae4aSArrigo Marchiori+#endif
595*9ceaae4aSArrigo Marchiori
596*9ceaae4aSArrigo Marchiori #ifdef _WIN32
597*9ceaae4aSArrigo Marchiori #  include "winconfig.h"
598*9ceaae4aSArrigo Marchiori+#else
599*9ceaae4aSArrigo Marchiori+#  include <expat_config.h>
600*9ceaae4aSArrigo Marchiori #endif
601*9ceaae4aSArrigo Marchiori
602*9ceaae4aSArrigo Marchiori #include "expat_external.h"
603*9ceaae4aSArrigo Marchioridiff -ru misc/expat-2.5.0/tests/runtests.c misc/build/expat-2.5.0/tests/runtests.c
604*9ceaae4aSArrigo Marchiori--- misc/expat-2.5.0/tests/runtests.c	2022-10-25 17:09:08.000000000 +0200
605*9ceaae4aSArrigo Marchiori+++ misc/build/expat-2.5.0/tests/runtests.c	2023-02-06 23:22:40.592116032 +0100
606*9ceaae4aSArrigo Marchiori@@ -40,7 +40,15 @@
607*9ceaae4aSArrigo Marchiori    USE OR OTHER DEALINGS IN THE SOFTWARE.
608*9ceaae4aSArrigo Marchiori */
609*9ceaae4aSArrigo Marchiori
610*9ceaae4aSArrigo Marchiori-#include <expat_config.h>
611*9ceaae4aSArrigo Marchiori+#ifdef _WIN32
612*9ceaae4aSArrigo Marchiori+#  include "winconfig.h"
613*9ceaae4aSArrigo Marchiori+#include <float.h>
614*9ceaae4aSArrigo Marchiori+#ifndef isnan
615*9ceaae4aSArrigo Marchiori+#define isnan _isnan
616*9ceaae4aSArrigo Marchiori+#endif
617*9ceaae4aSArrigo Marchiori+#else
618*9ceaae4aSArrigo Marchiori+#  include <expat_config.h>
619*9ceaae4aSArrigo Marchiori+#endif /* ndef _WIN32 */
620*9ceaae4aSArrigo Marchiori
621*9ceaae4aSArrigo Marchiori #if defined(NDEBUG)
622*9ceaae4aSArrigo Marchiori #  undef NDEBUG /* because test suite relies on assert(...) at the moment */
623*9ceaae4aSArrigo Marchiori@@ -53,11 +61,28 @@
624*9ceaae4aSArrigo Marchiori #include <stddef.h> /* ptrdiff_t */
625*9ceaae4aSArrigo Marchiori #include <ctype.h>
626*9ceaae4aSArrigo Marchiori #include <limits.h>
627*9ceaae4aSArrigo Marchiori-#include <stdint.h> /* intptr_t uint64_t */
628*9ceaae4aSArrigo Marchiori+
629*9ceaae4aSArrigo Marchiori+#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
630*9ceaae4aSArrigo Marchiori+/* vs2008/9.0 and earlier lack stdint.h; _MSC_VER 1600 is vs2010/10.0 */
631*9ceaae4aSArrigo Marchiori+#  if defined(_WIN64)
632*9ceaae4aSArrigo Marchiori+typedef unsigned __int64 uintptr_t;
633*9ceaae4aSArrigo Marchiori+#  else
634*9ceaae4aSArrigo Marchiori+typedef unsigned __int32 uintptr_t;
635*9ceaae4aSArrigo Marchiori+#  endif
636*9ceaae4aSArrigo Marchiori+#else
637*9ceaae4aSArrigo Marchiori+#  include <stdint.h> /* uintptr_t */
638*9ceaae4aSArrigo Marchiori+#endif
639*9ceaae4aSArrigo Marchiori
640*9ceaae4aSArrigo Marchiori #if ! defined(__cplusplus)
641*9ceaae4aSArrigo Marchiori+#if defined(_MSC_VER) && (_MSC_VER <= 1700)
642*9ceaae4aSArrigo Marchiori+/* for vs2012/11.0/1700 and earlier Visual Studio compilers */
643*9ceaae4aSArrigo Marchiori+#  define bool int
644*9ceaae4aSArrigo Marchiori+#  define false 0
645*9ceaae4aSArrigo Marchiori+#  define true 1
646*9ceaae4aSArrigo Marchiori+#else
647*9ceaae4aSArrigo Marchiori #  include <stdbool.h>
648*9ceaae4aSArrigo Marchiori #endif
649*9ceaae4aSArrigo Marchiori+#endif
650*9ceaae4aSArrigo Marchiori
651*9ceaae4aSArrigo Marchiori #include "expat.h"
652*9ceaae4aSArrigo Marchiori #include "chardata.h"
653*9ceaae4aSArrigo Marchiori@@ -2666,8 +2691,8 @@
654*9ceaae4aSArrigo Marchiori static void XMLCALL
655*9ceaae4aSArrigo Marchiori element_decl_check_model(void *userData, const XML_Char *name,
656*9ceaae4aSArrigo Marchiori                          XML_Content *model) {
657*9ceaae4aSArrigo Marchiori-  UNUSED_P(userData);
658*9ceaae4aSArrigo Marchiori   uint32_t errorFlags = 0;
659*9ceaae4aSArrigo Marchiori+  UNUSED_P(userData);
660*9ceaae4aSArrigo Marchiori
661*9ceaae4aSArrigo Marchiori   /* Expected model array structure is this:
662*9ceaae4aSArrigo Marchiori    * [0] (type 6, quant 0)
663*9ceaae4aSArrigo Marchiori@@ -3926,10 +3951,9 @@
664*9ceaae4aSArrigo Marchiori #if defined(XML_CONTEXT_BYTES)
665*9ceaae4aSArrigo Marchiori START_TEST(test_get_buffer_3_overflow) {
666*9ceaae4aSArrigo Marchiori   XML_Parser parser = XML_ParserCreate(NULL);
667*9ceaae4aSArrigo Marchiori-  assert(parser != NULL);
668*9ceaae4aSArrigo Marchiori-
669*9ceaae4aSArrigo Marchiori-  const char *const text = "\n";
670*9ceaae4aSArrigo Marchiori+  const char *text = "\n";
671*9ceaae4aSArrigo Marchiori   const int expectedKeepValue = (int)strlen(text);
672*9ceaae4aSArrigo Marchiori+  assert(parser != NULL);
673*9ceaae4aSArrigo Marchiori
674*9ceaae4aSArrigo Marchiori   // After this call, variable "keep" in XML_GetBuffer will
675*9ceaae4aSArrigo Marchiori   // have value expectedKeepValue
676*9ceaae4aSArrigo Marchiori@@ -4992,8 +5016,8 @@
677*9ceaae4aSArrigo Marchiori
678*9ceaae4aSArrigo Marchiori static void XMLCALL
679*9ceaae4aSArrigo Marchiori suspending_comment_handler(void *userData, const XML_Char *data) {
680*9ceaae4aSArrigo Marchiori-  UNUSED_P(data);
681*9ceaae4aSArrigo Marchiori   XML_Parser parser = (XML_Parser)userData;
682*9ceaae4aSArrigo Marchiori+  UNUSED_P(data);
683*9ceaae4aSArrigo Marchiori   XML_StopParser(parser, XML_TRUE);
684*9ceaae4aSArrigo Marchiori }
685*9ceaae4aSArrigo Marchiori
686*9ceaae4aSArrigo Marchiori@@ -6210,13 +6234,16 @@
687*9ceaae4aSArrigo Marchiori     for (; j < sizeof(atNameStart) / sizeof(atNameStart[0]); j++) {
688*9ceaae4aSArrigo Marchiori       const bool expectedSuccess
689*9ceaae4aSArrigo Marchiori           = atNameStart[j] ? cases[i].goodNameStart : cases[i].goodName;
690*9ceaae4aSArrigo Marchiori+      XML_Parser parser;
691*9ceaae4aSArrigo Marchiori+      enum XML_Status status;
692*9ceaae4aSArrigo Marchiori+      bool success;
693*9ceaae4aSArrigo Marchiori       sprintf(doc, "<%s%s><!--", atNameStart[j] ? "" : "a", cases[i].tagName);
694*9ceaae4aSArrigo Marchiori-      XML_Parser parser = XML_ParserCreate(NULL);
695*9ceaae4aSArrigo Marchiori+      parser = XML_ParserCreate(NULL);
696*9ceaae4aSArrigo Marchiori
697*9ceaae4aSArrigo Marchiori-      const enum XML_Status status
698*9ceaae4aSArrigo Marchiori+      status
699*9ceaae4aSArrigo Marchiori           = XML_Parse(parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
700*9ceaae4aSArrigo Marchiori
701*9ceaae4aSArrigo Marchiori-      bool success = true;
702*9ceaae4aSArrigo Marchiori+      success = true;
703*9ceaae4aSArrigo Marchiori       if ((status == XML_STATUS_OK) != expectedSuccess) {
704*9ceaae4aSArrigo Marchiori         success = false;
705*9ceaae4aSArrigo Marchiori       }
706*9ceaae4aSArrigo Marchiori@@ -6812,13 +6839,14 @@
707*9ceaae4aSArrigo Marchiori   CharData storage;
708*9ceaae4aSArrigo Marchiori   XML_Parser parser = XML_ParserCreate(NULL);
709*9ceaae4aSArrigo Marchiori   ParserPlusStorage parserPlusStorage = {parser, &storage};
710*9ceaae4aSArrigo Marchiori-
711*9ceaae4aSArrigo Marchiori+  enum XML_Status status;
712*9ceaae4aSArrigo Marchiori+
713*9ceaae4aSArrigo Marchiori   CharData_Init(&storage);
714*9ceaae4aSArrigo Marchiori   XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
715*9ceaae4aSArrigo Marchiori   XML_SetCommentHandler(parser, accumulate_and_suspend_comment_handler);
716*9ceaae4aSArrigo Marchiori   XML_SetUserData(parser, &parserPlusStorage);
717*9ceaae4aSArrigo Marchiori
718*9ceaae4aSArrigo Marchiori-  enum XML_Status status = XML_Parse(parser, text, (int)strlen(text), XML_TRUE);
719*9ceaae4aSArrigo Marchiori+  status = XML_Parse(parser, text, (int)strlen(text), XML_TRUE);
720*9ceaae4aSArrigo Marchiori   while (status == XML_STATUS_SUSPENDED) {
721*9ceaae4aSArrigo Marchiori     status = XML_ResumeParser(parser);
722*9ceaae4aSArrigo Marchiori   }
723*9ceaae4aSArrigo Marchiori@@ -10214,6 +10242,8 @@
724*9ceaae4aSArrigo Marchiori                                                  const XML_Char *base,
725*9ceaae4aSArrigo Marchiori                                                  const XML_Char *systemId,
726*9ceaae4aSArrigo Marchiori                                                  const XML_Char *publicId) {
727*9ceaae4aSArrigo Marchiori+  const XML_Char *encodingName = XCS("UTF-8"); // needs something non-NULL
728*9ceaae4aSArrigo Marchiori+  XML_Parser ext_parser;
729*9ceaae4aSArrigo Marchiori   UNUSED_P(base);
730*9ceaae4aSArrigo Marchiori   UNUSED_P(systemId);
731*9ceaae4aSArrigo Marchiori   UNUSED_P(publicId);
732*9ceaae4aSArrigo Marchiori@@ -10226,8 +10256,7 @@
733*9ceaae4aSArrigo Marchiori   // &(parser->m_mem));" in function parserInit.
734*9ceaae4aSArrigo Marchiori   allocation_count = 3;
735*9ceaae4aSArrigo Marchiori
736*9ceaae4aSArrigo Marchiori-  const XML_Char *const encodingName = XCS("UTF-8"); // needs something non-NULL
737*9ceaae4aSArrigo Marchiori-  const XML_Parser ext_parser
738*9ceaae4aSArrigo Marchiori+  ext_parser
739*9ceaae4aSArrigo Marchiori       = XML_ExternalEntityParserCreate(parser, context, encodingName);
740*9ceaae4aSArrigo Marchiori   if (ext_parser != NULL)
741*9ceaae4aSArrigo Marchiori     fail(
742*9ceaae4aSArrigo Marchiori@@ -11718,14 +11747,17 @@
743*9ceaae4aSArrigo Marchiori                                        const XML_Char *base,
744*9ceaae4aSArrigo Marchiori                                        const XML_Char *systemId,
745*9ceaae4aSArrigo Marchiori                                        const XML_Char *publicId) {
746*9ceaae4aSArrigo Marchiori-  UNUSED_P(context);
747*9ceaae4aSArrigo Marchiori-  UNUSED_P(base);
748*9ceaae4aSArrigo Marchiori-  UNUSED_P(publicId);
749*9ceaae4aSArrigo Marchiori-
750*9ceaae4aSArrigo Marchiori   const struct AccountingTestCase *const testCase
751*9ceaae4aSArrigo Marchiori       = (const struct AccountingTestCase *)XML_GetUserData(parser);
752*9ceaae4aSArrigo Marchiori
753*9ceaae4aSArrigo Marchiori   const char *externalText = NULL;
754*9ceaae4aSArrigo Marchiori+  XML_Parser entParser;
755*9ceaae4aSArrigo Marchiori+  XmlParseFunction xmlParseFunction;
756*9ceaae4aSArrigo Marchiori+  enum XML_Status status;
757*9ceaae4aSArrigo Marchiori+  UNUSED_P(context);
758*9ceaae4aSArrigo Marchiori+  UNUSED_P(base);
759*9ceaae4aSArrigo Marchiori+  UNUSED_P(publicId);
760*9ceaae4aSArrigo Marchiori+
761*9ceaae4aSArrigo Marchiori   if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
762*9ceaae4aSArrigo Marchiori     externalText = testCase->firstExternalText;
763*9ceaae4aSArrigo Marchiori   } else if (xcstrcmp(systemId, XCS("second.ent")) == 0) {
764*9ceaae4aSArrigo Marchiori@@ -11735,13 +11767,13 @@
765*9ceaae4aSArrigo Marchiori   }
766*9ceaae4aSArrigo Marchiori   assert(externalText);
767*9ceaae4aSArrigo Marchiori
768*9ceaae4aSArrigo Marchiori-  XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
769*9ceaae4aSArrigo Marchiori+  entParser = XML_ExternalEntityParserCreate(parser, context, 0);
770*9ceaae4aSArrigo Marchiori   assert(entParser);
771*9ceaae4aSArrigo Marchiori
772*9ceaae4aSArrigo Marchiori-  const XmlParseFunction xmlParseFunction
773*9ceaae4aSArrigo Marchiori+  xmlParseFunction
774*9ceaae4aSArrigo Marchiori       = testCase->singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
775*9ceaae4aSArrigo Marchiori
776*9ceaae4aSArrigo Marchiori-  const enum XML_Status status = xmlParseFunction(
777*9ceaae4aSArrigo Marchiori+  status = xmlParseFunction(
778*9ceaae4aSArrigo Marchiori       entParser, externalText, (int)strlen(externalText), XML_TRUE);
779*9ceaae4aSArrigo Marchiori
780*9ceaae4aSArrigo Marchiori   XML_ParserFree(entParser);
781*9ceaae4aSArrigo Marchiori@@ -11951,6 +11983,10 @@
782*9ceaae4aSArrigo Marchiori             + cases[u].expectedCountBytesIndirectExtra;
783*9ceaae4aSArrigo Marchiori
784*9ceaae4aSArrigo Marchiori       XML_Parser parser = XML_ParserCreate(NULL);
785*9ceaae4aSArrigo Marchiori+      XmlParseFunction xmlParseFunction;
786*9ceaae4aSArrigo Marchiori+      enum XML_Status status;
787*9ceaae4aSArrigo Marchiori+      unsigned long long actualCountBytesDirect;
788*9ceaae4aSArrigo Marchiori+      unsigned long long actualCountBytesIndirect;
789*9ceaae4aSArrigo Marchiori       XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
790*9ceaae4aSArrigo Marchiori       if (cases[u].firstExternalText) {
791*9ceaae4aSArrigo Marchiori         XML_SetExternalEntityRefHandler(parser,
792*9ceaae4aSArrigo Marchiori@@ -11959,19 +11995,19 @@
793*9ceaae4aSArrigo Marchiori         cases[u].singleBytesWanted = singleBytesWanted;
794*9ceaae4aSArrigo Marchiori       }
795*9ceaae4aSArrigo Marchiori
796*9ceaae4aSArrigo Marchiori-      const XmlParseFunction xmlParseFunction
797*9ceaae4aSArrigo Marchiori+      xmlParseFunction
798*9ceaae4aSArrigo Marchiori           = singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
799*9ceaae4aSArrigo Marchiori
800*9ceaae4aSArrigo Marchiori-      enum XML_Status status
801*9ceaae4aSArrigo Marchiori+      status
802*9ceaae4aSArrigo Marchiori           = xmlParseFunction(parser, cases[u].primaryText,
803*9ceaae4aSArrigo Marchiori                              (int)strlen(cases[u].primaryText), XML_TRUE);
804*9ceaae4aSArrigo Marchiori       if (status != XML_STATUS_OK) {
805*9ceaae4aSArrigo Marchiori         _xml_failure(parser, __FILE__, __LINE__);
806*9ceaae4aSArrigo Marchiori       }
807*9ceaae4aSArrigo Marchiori
808*9ceaae4aSArrigo Marchiori-      const unsigned long long actualCountBytesDirect
809*9ceaae4aSArrigo Marchiori+      actualCountBytesDirect
810*9ceaae4aSArrigo Marchiori           = testingAccountingGetCountBytesDirect(parser);
811*9ceaae4aSArrigo Marchiori-      const unsigned long long actualCountBytesIndirect
812*9ceaae4aSArrigo Marchiori+      actualCountBytesIndirect
813*9ceaae4aSArrigo Marchiori           = testingAccountingGetCountBytesIndirect(parser);
814*9ceaae4aSArrigo Marchiori
815*9ceaae4aSArrigo Marchiori       XML_ParserFree(parser);
816