Skip to content

Commit

Permalink
lib: Detect and prevent troublesome left shifts in function storeAtts
Browse files Browse the repository at this point in the history
  • Loading branch information
hartwork committed Dec 30, 2021
1 parent 60bbbe5 commit 5db4ba7
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
10 changes: 10 additions & 0 deletions expat/Changes
Expand Up @@ -3,9 +3,19 @@ NOTE: We are looking for help with a few things:
If you can help, please get in touch. Thanks!

Release x.x.x xxx xxxxxxxx xx xxxx
Security fixes:
#531 #534 Fix issues with left shifts by >=29 places
for XML documents with >=2^27+1 prefixed attributes
on a single XML tag a la
"<r xmlns:a='[..]' a:a123='[..]' [..] />".
(With xmlwf, it takes argument -n to trigger.)

Other changes:
#527 #528 Address compiler warnings

Special thanks to:
Tyson Smith

Release 2.4.2 Sun December 19 2021
Other changes:
#509 #510 Link againgst libm for function "isnan"
Expand Down
28 changes: 26 additions & 2 deletions expat/lib/xmlparse.c
Expand Up @@ -3414,7 +3414,13 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
if (nPrefixes) {
int j; /* hash table index */
unsigned long version = parser->m_nsAttsVersion;
int nsAttsSize = (int)1 << parser->m_nsAttsPower;

/* Detect and prevent invalid shift */
if (parser->m_nsAttsPower >= sizeof(unsigned int) * 8 /* bits per byte */) {
return XML_ERROR_NO_MEMORY;
}

unsigned int nsAttsSize = 1u << parser->m_nsAttsPower;
unsigned char oldNsAttsPower = parser->m_nsAttsPower;
/* size of hash table must be at least 2 * (# of prefixed attributes) */
if ((nPrefixes << 1)
Expand All @@ -3425,7 +3431,25 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
;
if (parser->m_nsAttsPower < 3)
parser->m_nsAttsPower = 3;
nsAttsSize = (int)1 << parser->m_nsAttsPower;

/* Detect and prevent invalid shift */
if (parser->m_nsAttsPower >= sizeof(nsAttsSize) * 8 /* bits per byte */) {
/* Restore actual size of memory in m_nsAtts */
parser->m_nsAttsPower = oldNsAttsPower;
return XML_ERROR_NO_MEMORY;
}

nsAttsSize = 1u << parser->m_nsAttsPower;

/* Detect and prevent integer overflow */
#if UINT_MAX >= SIZE_MAX // to silence "always false" -Wtype-limits warning
if (nsAttsSize > (size_t)(-1) / sizeof(NS_ATT)) {
/* Restore actual size of memory in m_nsAtts */
parser->m_nsAttsPower = oldNsAttsPower;
return XML_ERROR_NO_MEMORY;
}
#endif

temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts,
nsAttsSize * sizeof(NS_ATT));
if (! temp) {
Expand Down

0 comments on commit 5db4ba7

Please sign in to comment.