Hi,

libexpat 2.2.2 has been released, I would like to update it in base.

ok?

bluhm

Index: lib/libexpat/Changes
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/Changes,v
retrieving revision 1.7
diff -u -p -r1.7 Changes
--- lib/libexpat/Changes        30 Jun 2017 11:25:29 -0000      1.7
+++ lib/libexpat/Changes        14 Jul 2017 19:19:41 -0000
@@ -2,6 +2,56 @@ NOTE: We are looking for help with a few
       https://github.com/libexpat/libexpat/labels/help%20wanted
       If you can help, please get in touch.  Thanks!
 
+Release 2.2.2 Wed July 12 2017
+        Security fixes:
+             #43  Protect against compilation without any source of high
+                    quality entropy enabled, e.g. with CMake build system;
+                    commit ff0207e6076e9828e536b8d9cd45c9c92069b895
+             #60  Windows with _UNICODE:
+                    Unintended use of LoadLibraryW with a non-wide string
+                    resulted in failure to load advapi32.dll and degradation
+                    in quality of used entropy when compiled with _UNICODE for
+                    Windows; you can launch existing binaries with
+                    EXPAT_ENTROPY_DEBUG=1 in the environment to inspect the
+                    quality of entropy used during runtime; commits
+                    * 95b95032f907ef1cd17ee7a9a1768010a825d61d
+                    * 73a5a2e9c081f49f2d775cf7ced864158b68dc80
+   [MOX-006]      Fix non-NULL parser parameter validation in XML_Parse;
+                    resulted in NULL dereference, previously;
+                    commit ac256dafdffc9622ab0dc2c62fcecb0dfcfa71fe
+
+        Bug fixes:
+             #69  Fix improper use of unsigned long long integer literals
+
+        Other changes:
+             #73  Start requiring a C99 compiler
+             #49  Fix "==" Bashism in configure script
+             #50  Fix too eager getrandom detection for Debian GNU/kFreeBSD
+             #52    and macOS
+             #51  Address lack of stdint.h in Visual Studio 2003 to 2008
+             #58  Address compile warnings
+             #68  Fix "./buildconf.sh && ./configure" for some versions
+                    of Dash for /bin/sh
+             #72  CMake: Ease use of Expat in context of a parent project
+                    with multipe CMakeLists.txt files
+             #72  CMake: Resolve mistaken executable permissions
+             #76  Address compile warning with -DNDEBUG (not recommended!)
+             #77  Address compile warning about macro redefinition
+
+        Special thanks to:
+            Alexander Bluhm
+            Ben Boeckel
+            C??t??lin R??ceanu
+            Kerin Millar
+            L??szl?? B??sz??rm??nyi
+            S. P. Zeidler
+            Segev Finer
+            V??clav Slav??k
+            Victor Stinner
+            Viktor Szakats
+                 and
+            Radically Open Security
+
 Release 2.2.1 Sat June 17 2017
         Security fixes:
                   CVE-2017-9233 -- External entity infinite loop DoS
Index: lib/libexpat/README
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/README,v
retrieving revision 1.6
diff -u -p -r1.6 README
--- lib/libexpat/README 30 Jun 2017 11:25:29 -0000      1.6
+++ lib/libexpat/README 14 Jul 2017 19:19:41 -0000
@@ -1,5 +1,5 @@
 
-                        Expat, Release 2.2.1
+                        Expat, Release 2.2.2
 
 This is Expat, a C library for parsing XML, written by James Clark.
 Expat is a stream-oriented XML parser.  This means that you register
Index: lib/libexpat/lib/expat.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/lib/expat.h,v
retrieving revision 1.7
diff -u -p -r1.7 expat.h
--- lib/libexpat/lib/expat.h    30 Jun 2017 11:25:29 -0000      1.7
+++ lib/libexpat/lib/expat.h    14 Jul 2017 19:19:41 -0000
@@ -24,7 +24,6 @@ extern "C" {
 struct XML_ParserStruct;
 typedef struct XML_ParserStruct *XML_Parser;
 
-/* Should this be defined using stdbool.h when C99 is available? */
 typedef unsigned char XML_Bool;
 #define XML_TRUE   ((XML_Bool) 1)
 #define XML_FALSE  ((XML_Bool) 0)
@@ -1049,7 +1048,7 @@ XML_GetFeatureList(void);
 */
 #define XML_MAJOR_VERSION 2
 #define XML_MINOR_VERSION 2
-#define XML_MICRO_VERSION 1
+#define XML_MICRO_VERSION 2
 
 #ifdef __cplusplus
 }
Index: lib/libexpat/lib/siphash.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/lib/siphash.h,v
retrieving revision 1.2
diff -u -p -r1.2 siphash.h
--- lib/libexpat/lib/siphash.h  6 Jul 2017 13:06:34 -0000       1.2
+++ lib/libexpat/lib/siphash.h  14 Jul 2017 19:19:41 -0000
@@ -2,9 +2,8 @@
  * siphash.h - SipHash-2-4 in a single header file
  * --------------------------------------------------------------------------
  * Derived by William Ahern from the reference implementation[1] published[2]
- * by Jean-Philippe Aumasson and Daniel J. Berstein. Licensed in kind.
  * by Jean-Philippe Aumasson and Daniel J. Berstein.
- * Minimal changes by Sebastian Pipping on top, details below.
+ * Minimal changes by Sebastian Pipping and Victor Stinner on top, see below.
  * Licensed under the CC0 Public Domain Dedication license.
  *
  * 1. https://www.131002.net/siphash/siphash24.c
@@ -12,13 +11,22 @@
  * --------------------------------------------------------------------------
  * HISTORY:
  *
- * 2017-06-10  (Sebastian Pipping)
+ * 2017-07-05  (Sebastian Pipping)
+ *   - Use _SIP_ULL macro to not require a C++11 compiler if compiled as C++
+ *   - Add const qualifiers at two places
+ *   - Ensure <=80 characters line length (assuming tab width 4)
+ *
+ * 2017-06-23  (Victor Stinner)
+ *   - Address Win64 compile warnings
+ *
+ * 2017-06-18  (Sebastian Pipping)
  *   - Clarify license note in the header
  *   - Address C89 issues:
  *     - Stop using inline keyword (and let compiler decide)
  *     - Replace _Bool by int
  *     - Turn macro siphash24 into a function
  *     - Address invalid conversion (void pointer) by explicit cast
+ *   - Address lack of stdint.h for Visual Studio 2003 to 2008
  *   - Always expose sip24_valid (for self-tests)
  *
  * 2012-11-04 - Born.  (William Ahern)
@@ -75,7 +83,23 @@
 #define SIPHASH_H
 
 #include <stddef.h> /* size_t */
-#include <stdint.h> /* uint64_t uint32_t uint8_t */
+
+#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
+  /* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
+  typedef unsigned __int8   uint8_t;
+  typedef unsigned __int32 uint32_t;
+  typedef unsigned __int64 uint64_t;
+#else
+ #include <stdint.h> /* uint64_t uint32_t uint8_t */
+#endif
+
+
+/*
+ * Workaround to not require a C++11 compiler for using ULL suffix
+ * if this code is included and compiled as C++; related GCC warning is:
+ * warning: use of C++11 long long integer constant [-Wlong-long]
+ */
+#define _SIP_ULL(high, low)  (((uint64_t)high << 32) | low)
 
 
 #define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b))))
@@ -157,11 +181,12 @@ static void sip_round(struct siphash *H,
 } /* sip_round() */
 
 
-static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) 
{
-       H->v0 = 0x736f6d6570736575ULL ^ key->k[0];
-       H->v1 = 0x646f72616e646f6dULL ^ key->k[1];
-       H->v2 = 0x6c7967656e657261ULL ^ key->k[0];
-       H->v3 = 0x7465646279746573ULL ^ key->k[1];
+static struct siphash *sip24_init(struct siphash *H,
+               const struct sipkey *key) {
+       H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
+       H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
+       H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
+       H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
 
        H->p = H->buf;
        H->c = 0;
@@ -172,7 +197,8 @@ static struct siphash *sip24_init(struct
 
 #define sip_endof(a) (&(a)[sizeof (a) / sizeof *(a)])
 
-static struct siphash *sip24_update(struct siphash *H, const void *src, size_t 
len) {
+static struct siphash *sip24_update(struct siphash *H, const void *src,
+               size_t len) {
        const unsigned char *p = (const unsigned char *)src, *pe = p + len;
        uint64_t m;
 
@@ -197,7 +223,7 @@ static struct siphash *sip24_update(stru
 
 
 static uint64_t sip24_final(struct siphash *H) {
-       char left = H->p - H->buf;
+       const char left = (char)(H->p - H->buf);
        uint64_t b = (H->c + left) << 56;
 
        switch (left) {
@@ -221,7 +247,8 @@ static uint64_t sip24_final(struct sipha
 } /* sip24_final() */
 
 
-static uint64_t siphash24(const void *src, size_t len, const struct sipkey 
*key) {
+static uint64_t siphash24(const void *src, size_t len,
+               const struct sipkey *key) {
        struct siphash state = SIPHASH_INITIALIZER;
        return sip24_final(sip24_update(sip24_init(&state, key), src, len));
 } /* siphash24() */
@@ -309,10 +336,11 @@ static int sip24_valid(void) {
        struct sipkey k;
        size_t i;
 
-       sip_tokey(&k, 
"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017");
+       sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011"
+                       "\012\013\014\015\016\017");
 
        for (i = 0; i < sizeof in; ++i) {
-               in[i] = i;
+               in[i] = (unsigned char)i;
 
                if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i]))
                        return 0;
@@ -327,7 +355,7 @@ static int sip24_valid(void) {
 #include <stdio.h>
 
 int main(void) {
-       int ok = sip24_valid();
+       const int ok = sip24_valid();
 
        if (ok)
                puts("OK");
Index: lib/libexpat/lib/xmlparse.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/lib/xmlparse.c,v
retrieving revision 1.17
diff -u -p -r1.17 xmlparse.c
--- lib/libexpat/lib/xmlparse.c 30 Jun 2017 11:25:29 -0000      1.17
+++ lib/libexpat/lib/xmlparse.c 14 Jul 2017 19:23:42 -0000
@@ -1,10 +1,12 @@
 /* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
    See the file COPYING for copying permission.
 
-   77fea421d361dca90041d0040ecf1dca651167fadf2af79e990e35168d70d933 (2.2.1+)
+   cd4063469a95eab9a93001afb109e3dee122cdda4635bbec36257fc01c327348 (2.2.2+)
 */
 
-#define _GNU_SOURCE                     /* syscall prototype */
+#if !defined(_GNU_SOURCE)
+# define _GNU_SOURCE 1                  /* syscall prototype */
+#endif
 
 #include <stddef.h>
 #include <string.h>                     /* memset(), memcpy() */
@@ -436,6 +438,9 @@ static ELEMENT_TYPE *
 getElementType(XML_Parser parser, const ENCODING *enc,
                const char *ptr, const char *end);
 
+static XML_Char *copyString(const XML_Char *s,
+                            const XML_Memory_Handling_Suite *memsuite);
+
 static unsigned long generate_hash_secret_salt(XML_Parser parser);
 static XML_Bool startParsing(XML_Parser parser);
 
@@ -827,6 +832,8 @@ parserCreate(const XML_Char *encodingNam
   nsAttsVersion = 0;
   nsAttsPower = 0;
 
+  protocolEncodingName = NULL;
+
   poolInit(&tempPool, &(parser->m_mem));
   poolInit(&temp2Pool, &(parser->m_mem));
   parserInit(parser, encodingName);
@@ -853,9 +860,9 @@ parserInit(XML_Parser parser, const XML_
 {
   processor = prologInitProcessor;
   XmlPrologStateInit(&prologState);
-  protocolEncodingName = (encodingName != NULL
-                          ? poolCopyString(&tempPool, encodingName)
-                          : NULL);
+  if (encodingName != NULL) {
+    protocolEncodingName = copyString(encodingName, &(parser->m_mem));
+  }
   curBase = NULL;
   XmlInitEncoding(&initEncoding, &encoding, 0);
   userData = NULL;
@@ -968,6 +975,8 @@ XML_ParserReset(XML_Parser parser, const
     unknownEncodingRelease(unknownEncodingData);
   poolClear(&tempPool);
   poolClear(&temp2Pool);
+  FREE((void *)protocolEncodingName);
+  protocolEncodingName = NULL;
   parserInit(parser, encodingName);
   dtdReset(_dtd, &parser->m_mem);
   return XML_TRUE;
@@ -984,10 +993,16 @@ XML_SetEncoding(XML_Parser parser, const
   */
   if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
     return XML_STATUS_ERROR;
+
+  /* Get rid of any previous encoding name */
+  FREE((void *)protocolEncodingName);
+
   if (encodingName == NULL)
+    /* No new encoding name */
     protocolEncodingName = NULL;
   else {
-    protocolEncodingName = poolCopyString(&tempPool, encodingName);
+    /* Copy the new encoding name into allocated memory */
+    protocolEncodingName = copyString(encodingName, &(parser->m_mem));
     if (!protocolEncodingName)
       return XML_STATUS_ERROR;
   }
@@ -1222,6 +1237,7 @@ XML_ParserFree(XML_Parser parser)
   destroyBindings(inheritedBindings, parser);
   poolDestroy(&tempPool);
   poolDestroy(&temp2Pool);
+  FREE((void *)protocolEncodingName);
 #ifdef XML_DTD
   /* external parameter entity parsers share the DTD structure
      parser->m_dtd with the root parser, so we must not destroy it
@@ -1613,7 +1629,8 @@ enum XML_Status XMLCALL
 XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
 {
   if ((parser == NULL) || (len < 0) || ((s == NULL) && (len != 0))) {
-    errorCode = XML_ERROR_INVALID_ARGUMENT;
+    if (parser != NULL)
+      parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT;
     return XML_STATUS_ERROR;
   }
   switch (ps_parsing) {
@@ -3599,6 +3616,7 @@ initializeEncoding(XML_Parser parser)
   const char *s;
 #ifdef XML_UNICODE
   char encodingBuf[128];
+  /* See comments abount `protoclEncodingName` in parserInit() */
   if (!protocolEncodingName)
     s = NULL;
   else {
@@ -6691,4 +6709,27 @@ getElementType(XML_Parser parser,
       return NULL;
   }
   return ret;
+}
+
+static XML_Char *
+copyString(const XML_Char *s,
+           const XML_Memory_Handling_Suite *memsuite)
+{
+    int charsRequired = 0;
+    XML_Char *result;
+
+    /* First determine how long the string is */
+    while (s[charsRequired] != 0) {
+      charsRequired++;
+    }
+    /* Include the terminator */
+    charsRequired++;
+
+    /* Now allocate space for the copy */
+    result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char));
+    if (result == NULL)
+        return NULL;
+    /* Copy the original into place */
+    memcpy(result, s, charsRequired * sizeof(XML_Char));
+    return result;
 }
Index: lib/libexpat/tests/memcheck.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/tests/memcheck.c,v
retrieving revision 1.1
diff -u -p -r1.1 memcheck.c
--- lib/libexpat/tests/memcheck.c       30 Jun 2017 14:43:26 -0000      1.1
+++ lib/libexpat/tests/memcheck.c       14 Jul 2017 19:19:41 -0000
@@ -167,7 +167,7 @@ tracking_report(void)
     for (entry = alloc_head; entry != NULL; entry = entry->next)
     {
         printf("Allocated %lu bytes at %p\n",
-               entry->num_bytes, entry->allocation);
+                (long unsigned)entry->num_bytes, entry->allocation);
     }
     return 0;
 }
Index: lib/libexpat/tests/minicheck.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/tests/minicheck.h,v
retrieving revision 1.1
diff -u -p -r1.1 minicheck.h
--- lib/libexpat/tests/minicheck.h      30 Jun 2017 14:43:26 -0000      1.1
+++ lib/libexpat/tests/minicheck.h      14 Jul 2017 19:19:41 -0000
@@ -26,12 +26,6 @@ extern "C" {
 #define __func__ __FUNCTION__
 #endif
 
-/* ISO C90 does not support '__func__' predefined identifier */
-#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ < 199901)) || \
-    (defined(__GNUC__) && !defined(__STDC_VERSION__))
-# define __func__ "(unknown)"
-#endif
-
 #define START_TEST(testname) static void testname(void) { \
     _check_set_test_info(__func__, __FILE__, __LINE__);   \
     {
Index: lib/libexpat/tests/runtests.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/lib/libexpat/tests/runtests.c,v
retrieving revision 1.2
diff -u -p -r1.2 runtests.c
--- lib/libexpat/tests/runtests.c       6 Jul 2017 13:06:34 -0000       1.2
+++ lib/libexpat/tests/runtests.c       14 Jul 2017 19:19:41 -0000
@@ -33,6 +33,18 @@
 #define XML_FMT_INT_MOD "l"
 #endif
 
+
+#if defined(NDEBUG)
+# error  \
+    The test suite relies on assert(...) at the moment. \
+    You have NDEBUG defined which removes that code so that failures in the \
+    test suite can go unnoticed. \
+    \
+    While we rely on assert(...), compiling the test suite with NDEBUG \
+    defined is not supported.
+#endif
+
+
 static XML_Parser parser = NULL;
 
 
@@ -247,7 +259,7 @@ START_TEST(test_siphash_spec)
     const char message[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
             "\x0a\x0b\x0c\x0d\x0e";
     const size_t len = sizeof(message) - 1;
-    const uint64_t expected = 0xa129ca6149be45e5ULL;
+    const uint64_t expected = _SIP_ULL(0xa129ca61U, 0x49be45e5U);
     struct siphash state;
     struct sipkey key;
     (void)sip_tobin;
@@ -489,9 +501,11 @@ START_TEST(test_utf8_auto_align)
         if (actualMovementInChars != cases[i].expectedMovementInChars) {
             size_t j = 0;
             success = false;
-            printf("[-] UTF-8 case %2lu: Expected movement by %2ld chars"
-                    ", actually moved by %2ld chars: \"",
-                    i + 1, cases[i].expectedMovementInChars, 
actualMovementInChars);
+            printf("[-] UTF-8 case %2u: Expected movement by %2d chars"
+                    ", actually moved by %2d chars: \"",
+                    (unsigned)(i + 1),
+                    (int)cases[i].expectedMovementInChars,
+                    (int)actualMovementInChars);
             for (; j < strlen(cases[i].input); j++) {
                 printf("\\x%02x", (unsigned char)cases[i].input[j]);
             }

Reply via email to