[ expat-Bugs-579196 ] Memory corruption with non-ASCII names
noreply@sourceforge.net
noreply@sourceforge.net
Tue Jul 9 11:09:05 2002
Bugs item #579196, was opened at 2002-07-09 13:47
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=110127&aid=579196&group_id=10127
Category: None
Group: None
Status: Open
>Resolution: Accepted
Priority: 6
Submitted By: Karl Waclawek (kwaclaw)
Assigned to: Karl Waclawek (kwaclaw)
Summary: Memory corruption with non-ASCII names
Initial Comment:
I ran into a problem with Expat overwriting my
aplication memory. This happens when the content
model in an element declaration contains names
that are non-ASCII (e.g. Japanese).
This bug is hard to find, because it will not
always bite.
I could trace this down to the following section
in the function doProlog, under switch case
XML_ROLE_CONTENT_ELEMENT_PLUS:
...
el = getElementType(parser, enc, s, nxt);
if (!el)
return XML_ERROR_NO_MEMORY;
dtd.scaffold[myindex].name = el->name;
dtd.contentStringLen += nxt - s + 1;
...
dtd.contentStringLen is supposed to be incremented
by the length of el->name. However, for non-ASCII
names, the input length, nxt - s + 1, is not the
same as the encoded length. The function
poolStoreString within getElementType encodes the
name from the input encoding to the working
encoding of Expat (UTF-8 or UTF-16).
Specifically, in my test case, using a DTD encoded
in UTF-16BE and a working encoding of UTF-8, this
problem manifested itself in my app crashing badly.
Therefore I suggest this fix:
...
const XML_Char *name;
int nameLen;
...
el = getElementType(parser, enc, s, nxt);
if (!el)
return XML_ERROR_NO_MEMORY;
name = el->name;
dtd.scaffold[myindex].name = name;
nameLen = 0;
for (; name[nameLen++]; );
dtd.contentStringLen += nameLen;
...
Karl
----------------------------------------------------------------------
>Comment By: Fred L. Drake, Jr. (fdrake)
Date: 2002-07-09 14:08
Message:
Logged In: YES
user_id=3066
I like this change; feel free to check it in and close the bug.
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=110127&aid=579196&group_id=10127