From ed36812db2017e8a68eb7825ecd8dd2bc89cd2e5 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Sat, 24 Apr 2021 21:13:24 +0200 Subject: [PATCH] lib: Fix macro IS_INVALID_CHAR (for UTF-16 with macro XML_MIN_SIZE defined) What happens is that with macro XML_MIN_SIZE defined, for UTF-16 macro IS_INVALID_CHAR was being set to .. > #define IS_INVALID_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p)) .. which calls NULL pointers in .isInvalid{2,3,4} at runtime. For UTF-16 we actually need what xmltok_impl.c does for macro IS_INVALID_CHAR when it has not yet been defined: > # ifndef IS_INVALID_CHAR > # define IS_INVALID_CHAR(enc, ptr, n) (0) > # endif So the fix is a combination of these two: - Use .isInvalid{2,3,4} where needed and available and - return 0/false for UTF-16 where .isInvalid{2,3,4} are NULL. --- expat/Changes | 8 ++++++++ expat/lib/xmltok.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/expat/Changes b/expat/Changes index 40b716d9..69c39f37 100644 --- a/expat/Changes +++ b/expat/Changes @@ -3,12 +3,20 @@ NOTE: We are looking for help with a few things: If you can help, please get in touch. Thanks! Release X.X.X XXX XXXXX XX XXXX + Bug fixes: + #332 #470 For (non-default) compilation with -DEXPAT_MIN_SIZE=ON (CMake) + or CPPFLAGS=-DXML_MIN_SIZE (GNU Autotools): Fix segfault + for UTF-16 payloads containing CDATA sections. + Other changes: #457 Unexpose symbol _INTERNAL_trim_to_complete_utf8_characters #458 #459 CMake: Support absolute paths for both CMAKE_INSTALL_LIBDIR and CMAKE_INSTALL_INCLUDEDIR #468 #469 xmlwf: Improve help output and the xmlwf man page + Special thanks to: + Dimitry Andric + Release 2.3.0 Thu March 25 2021 Bug fixes: #438 When calling XML_ParseBuffer without a prior successful call to diff --git a/expat/lib/xmltok.c b/expat/lib/xmltok.c index d9474240..7759ffb6 100644 --- a/expat/lib/xmltok.c +++ b/expat/lib/xmltok.c @@ -259,8 +259,14 @@ sb_byteToAscii(const ENCODING *enc, const char *p) { #define IS_NAME_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isName##n(enc, p)) #define IS_NMSTRT_CHAR(enc, p, n) (AS_NORMAL_ENCODING(enc)->isNmstrt##n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p)) +#ifdef XML_MIN_SIZE +# define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid##n \ + && AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p)) +#else +# define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid##n(enc, p)) +#endif #ifdef XML_MIN_SIZE # define IS_NAME_CHAR_MINBPC(enc, p) \