Skip to content

Commit ec4ab09

Browse files
authored
bpo-30947: Update libexpat from 2.2.1 to 2.2.3 (#3106) (#3145)
* bpo-30947: Update libexpat from 2.2.1 to 2.2.3 * Add NEWS entry * Add new loadlibrary.c * expat_external.h: restore include "pyexpatns.h" * PCbuild: add expat/loadlibrary.c * Define XML_POOR_ENTROPY to compile expat Python 2.7 backport: add expat/loadlibrary.c to PC/VS9.0/ project files (_elementtree and pyexpat). (cherry picked from commit 93d0cb5)
1 parent 5e006aa commit ec4ab09

15 files changed

+730
-102
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to get security
2+
fixes.

Modules/expat/expat.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ extern "C" {
2424
struct XML_ParserStruct;
2525
typedef struct XML_ParserStruct *XML_Parser;
2626

27-
/* Should this be defined using stdbool.h when C99 is available? */
2827
typedef unsigned char XML_Bool;
2928
#define XML_TRUE ((XML_Bool) 1)
3029
#define XML_FALSE ((XML_Bool) 0)
@@ -1049,7 +1048,7 @@ XML_GetFeatureList(void);
10491048
*/
10501049
#define XML_MAJOR_VERSION 2
10511050
#define XML_MINOR_VERSION 2
1052-
#define XML_MICRO_VERSION 1
1051+
#define XML_MICRO_VERSION 3
10531052

10541053
#ifdef __cplusplus
10551054
}

Modules/expat/loadlibrary.c

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
/***************************************************************************
2+
* _ _ ____ _
3+
* Project ___| | | | _ \| |
4+
* / __| | | | |_) | |
5+
* | (__| |_| | _ <| |___
6+
* \___|\___/|_| \_\_____|
7+
*
8+
* Copyright (C) 2016 - 2017, Steve Holme, <[email protected]>.
9+
*
10+
* All rights reserved.
11+
*
12+
* Permission to use, copy, modify, and distribute this software for any
13+
* purpose with or without fee is hereby granted, provided that the above
14+
* copyright notice and this permission notice appear in all copies.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
19+
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20+
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21+
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
22+
* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23+
*
24+
* Except as contained in this notice, the name of a copyright holder shall
25+
* not be used in advertising or otherwise to promote the sale, use or other
26+
* dealings in this Software without prior written authorization of the
27+
* copyright holder.
28+
*
29+
***************************************************************************/
30+
31+
#if defined(_WIN32)
32+
33+
#include <windows.h>
34+
#include <tchar.h>
35+
36+
37+
HMODULE _Expat_LoadLibrary(LPCTSTR filename);
38+
39+
40+
#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
41+
#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
42+
#endif
43+
44+
#if !defined(LOAD_LIBRARY_SEARCH_SYSTEM32)
45+
#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
46+
#endif
47+
48+
/* We use our own typedef here since some headers might lack these */
49+
typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
50+
51+
/* See function definitions in winbase.h */
52+
#ifdef UNICODE
53+
# ifdef _WIN32_WCE
54+
# define LOADLIBARYEX L"LoadLibraryExW"
55+
# else
56+
# define LOADLIBARYEX "LoadLibraryExW"
57+
# endif
58+
#else
59+
# define LOADLIBARYEX "LoadLibraryExA"
60+
#endif
61+
62+
63+
/*
64+
* _Expat_LoadLibrary()
65+
*
66+
* This is used to dynamically load DLLs using the most secure method available
67+
* for the version of Windows that we are running on.
68+
*
69+
* Parameters:
70+
*
71+
* filename [in] - The filename or full path of the DLL to load. If only the
72+
* filename is passed then the DLL will be loaded from the
73+
* Windows system directory.
74+
*
75+
* Returns the handle of the module on success; otherwise NULL.
76+
*/
77+
HMODULE _Expat_LoadLibrary(LPCTSTR filename)
78+
{
79+
HMODULE hModule = NULL;
80+
LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
81+
82+
/* Get a handle to kernel32 so we can access it's functions at runtime */
83+
HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32"));
84+
if(!hKernel32)
85+
return NULL;
86+
87+
/* Attempt to find LoadLibraryEx() which is only available on Windows 2000
88+
and above */
89+
pLoadLibraryEx = (LOADLIBRARYEX_FN) GetProcAddress(hKernel32, LOADLIBARYEX);
90+
91+
/* Detect if there's already a path in the filename and load the library if
92+
there is. Note: Both back slashes and forward slashes have been supported
93+
since the earlier days of DOS at an API level although they are not
94+
supported by command prompt */
95+
if(_tcspbrk(filename, TEXT("\\/"))) {
96+
/** !checksrc! disable BANNEDFUNC 1 **/
97+
hModule = pLoadLibraryEx ?
98+
pLoadLibraryEx(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
99+
LoadLibrary(filename);
100+
}
101+
/* Detect if KB2533623 is installed, as LOAD_LIBARY_SEARCH_SYSTEM32 is only
102+
supported on Windows Vista, Windows Server 2008, Windows 7 and Windows
103+
Server 2008 R2 with this patch or natively on Windows 8 and above */
104+
else if(pLoadLibraryEx && GetProcAddress(hKernel32, "AddDllDirectory")) {
105+
/* Load the DLL from the Windows system directory */
106+
hModule = pLoadLibraryEx(filename, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
107+
}
108+
else {
109+
/* Attempt to get the Windows system path */
110+
UINT systemdirlen = GetSystemDirectory(NULL, 0);
111+
if(systemdirlen) {
112+
/* Allocate space for the full DLL path (Room for the null terminator
113+
is included in systemdirlen) */
114+
size_t filenamelen = _tcslen(filename);
115+
TCHAR *path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen));
116+
if(path && GetSystemDirectory(path, systemdirlen)) {
117+
/* Calculate the full DLL path */
118+
_tcscpy(path + _tcslen(path), TEXT("\\"));
119+
_tcscpy(path + _tcslen(path), filename);
120+
121+
/* Load the DLL from the Windows system directory */
122+
/** !checksrc! disable BANNEDFUNC 1 **/
123+
hModule = pLoadLibraryEx ?
124+
pLoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
125+
LoadLibrary(path);
126+
127+
}
128+
free(path);
129+
}
130+
}
131+
132+
return hModule;
133+
}
134+
135+
#else /* defined(_WIN32) */
136+
137+
/* ISO C requires a translation unit to contain at least one declaration
138+
[-Wempty-translation-unit] */
139+
typedef int _TRANSLATION_UNIT_LOAD_LIBRARY_C_NOT_EMTPY;
140+
141+
#endif /* defined(_WIN32) */

Modules/expat/siphash.h

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,34 @@
22
* siphash.h - SipHash-2-4 in a single header file
33
* --------------------------------------------------------------------------
44
* Derived by William Ahern from the reference implementation[1] published[2]
5-
* by Jean-Philippe Aumasson and Daniel J. Berstein. Licensed in kind.
65
* by Jean-Philippe Aumasson and Daniel J. Berstein.
7-
* Minimal changes by Sebastian Pipping on top, details below.
6+
* Minimal changes by Sebastian Pipping and Victor Stinner on top, see below.
87
* Licensed under the CC0 Public Domain Dedication license.
98
*
109
* 1. https://www.131002.net/siphash/siphash24.c
1110
* 2. https://www.131002.net/siphash/
1211
* --------------------------------------------------------------------------
1312
* HISTORY:
1413
*
15-
* 2017-06-18 (Sebastian Pipping)
16-
* - Address lack of stdint.h for Visual Studio 2003 to 2008
14+
* 2017-07-25 (Vadim Zeitlin)
15+
* - Fix use of SIPHASH_MAIN macro
16+
*
17+
* 2017-07-05 (Sebastian Pipping)
18+
* - Use _SIP_ULL macro to not require a C++11 compiler if compiled as C++
19+
* - Add const qualifiers at two places
20+
* - Ensure <=80 characters line length (assuming tab width 4)
1721
*
18-
* 2017-06-10 (Sebastian Pipping)
22+
* 2017-06-23 (Victor Stinner)
23+
* - Address Win64 compile warnings
24+
*
25+
* 2017-06-18 (Sebastian Pipping)
1926
* - Clarify license note in the header
2027
* - Address C89 issues:
2128
* - Stop using inline keyword (and let compiler decide)
22-
* - Turn integer suffix ULL to UL
2329
* - Replace _Bool by int
2430
* - Turn macro siphash24 into a function
2531
* - Address invalid conversion (void pointer) by explicit cast
32+
* - Address lack of stdint.h for Visual Studio 2003 to 2008
2633
* - Always expose sip24_valid (for self-tests)
2734
*
2835
* 2012-11-04 - Born. (William Ahern)
@@ -90,6 +97,14 @@
9097
#endif
9198

9299

100+
/*
101+
* Workaround to not require a C++11 compiler for using ULL suffix
102+
* if this code is included and compiled as C++; related GCC warning is:
103+
* warning: use of C++11 long long integer constant [-Wlong-long]
104+
*/
105+
#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low)
106+
107+
93108
#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b))))
94109

95110
#define SIP_U32TO8_LE(p, v) \
@@ -169,11 +184,12 @@ static void sip_round(struct siphash *H, const int rounds) {
169184
} /* sip_round() */
170185

171186

172-
static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) {
173-
H->v0 = 0x736f6d6570736575UL ^ key->k[0];
174-
H->v1 = 0x646f72616e646f6dUL ^ key->k[1];
175-
H->v2 = 0x6c7967656e657261UL ^ key->k[0];
176-
H->v3 = 0x7465646279746573UL ^ key->k[1];
187+
static struct siphash *sip24_init(struct siphash *H,
188+
const struct sipkey *key) {
189+
H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
190+
H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
191+
H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
192+
H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
177193

178194
H->p = H->buf;
179195
H->c = 0;
@@ -184,7 +200,8 @@ static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) {
184200

185201
#define sip_endof(a) (&(a)[sizeof (a) / sizeof *(a)])
186202

187-
static struct siphash *sip24_update(struct siphash *H, const void *src, size_t len) {
203+
static struct siphash *sip24_update(struct siphash *H, const void *src,
204+
size_t len) {
188205
const unsigned char *p = (const unsigned char *)src, *pe = p + len;
189206
uint64_t m;
190207

@@ -209,7 +226,7 @@ static struct siphash *sip24_update(struct siphash *H, const void *src, size_t l
209226

210227

211228
static uint64_t sip24_final(struct siphash *H) {
212-
char left = H->p - H->buf;
229+
const char left = (char)(H->p - H->buf);
213230
uint64_t b = (H->c + left) << 56;
214231

215232
switch (left) {
@@ -233,7 +250,8 @@ static uint64_t sip24_final(struct siphash *H) {
233250
} /* sip24_final() */
234251

235252

236-
static uint64_t siphash24(const void *src, size_t len, const struct sipkey *key) {
253+
static uint64_t siphash24(const void *src, size_t len,
254+
const struct sipkey *key) {
237255
struct siphash state = SIPHASH_INITIALIZER;
238256
return sip24_final(sip24_update(sip24_init(&state, key), src, len));
239257
} /* siphash24() */
@@ -321,10 +339,11 @@ static int sip24_valid(void) {
321339
struct sipkey k;
322340
size_t i;
323341

324-
sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017");
342+
sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011"
343+
"\012\013\014\015\016\017");
325344

326345
for (i = 0; i < sizeof in; ++i) {
327-
in[i] = i;
346+
in[i] = (unsigned char)i;
328347

329348
if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i]))
330349
return 0;
@@ -334,12 +353,12 @@ static int sip24_valid(void) {
334353
} /* sip24_valid() */
335354

336355

337-
#if SIPHASH_MAIN
356+
#ifdef SIPHASH_MAIN
338357

339358
#include <stdio.h>
340359

341360
int main(void) {
342-
int ok = sip24_valid();
361+
const int ok = sip24_valid();
343362

344363
if (ok)
345364
puts("OK");

0 commit comments

Comments
 (0)