mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-12-16 06:08:09 +08:00
PR 31283 windmc: Parse input correctly on big endian hosts
On big endian hosts (eg. s390x) the windmc tool fails to parse even
trivial files:
$ cat test.mc
;
$ ./binutils/windmc ./test.mc
In test.mc at line 1: parser: syntax error.
In test.mc at line 1: fatal: syntax error.
The tool starts by reading the input as Windows CP1252 and then
converting it internally into an array of UTF-16LE, which it then
processes as an array of unsigned short (typedef unichar).
There are lots of ways this is wrong, but in the specific case of big
endian machines the little endian pairs of bytes are byte-swapped.
For example, the ';' character in the input above is first converted
to UTF16-LE byte sequence { 0x3b, 0x00 }, which is then cast to
unsigned short. On a big endian machine the first unichar appears to
be 0x3b00. The lexer is unable to recognize this as the comment
character ((unichar)';') and so parsing fails.
The simple fix is to convert the input to UTF-16BE on big endian
machines (and do the reverse conversion when writing the output).
Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=31283
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
This commit is contained in:
committed by
Alan Modra
parent
16688387ed
commit
3f8f9745c7
@@ -771,7 +771,13 @@ wind_MultiByteToWideChar (rc_uint_type cp, const char *mb,
|
||||
|
||||
if (!mb || !iconv_name)
|
||||
return 0;
|
||||
iconv_t cd = iconv_open ("UTF-16LE", iconv_name);
|
||||
iconv_t cd = iconv_open (
|
||||
#if WORDS_BIGENDIAN
|
||||
"UTF-16BE",
|
||||
#else
|
||||
"UTF-16LE",
|
||||
#endif
|
||||
iconv_name);
|
||||
|
||||
while (1)
|
||||
{
|
||||
@@ -844,7 +850,13 @@ wind_WideCharToMultiByte (rc_uint_type cp, const unichar *u, char *mb, rc_uint_t
|
||||
|
||||
if (!u || !iconv_name)
|
||||
return 0;
|
||||
iconv_t cd = iconv_open (iconv_name, "UTF-16LE");
|
||||
iconv_t cd = iconv_open (iconv_name,
|
||||
#if WORDS_BIGENDIAN
|
||||
"UTF-16BE"
|
||||
#else
|
||||
"UTF-16LE"
|
||||
#endif
|
||||
);
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user