diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-11 23:56:55 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-11 23:56:55 (GMT) |
commit | d6e8de179758bcb7a68a694b9b6086d02bf22c3e (patch) | |
tree | 0d86b6c30f3840cf895747dd37d24341f9e2510f /Objects/unicodeobject.c | |
parent | a4a37fefb645316c2694f9ef50fa3bbddb41d0ba (diff) | |
download | cpython-d6e8de179758bcb7a68a694b9b6086d02bf22c3e.zip cpython-d6e8de179758bcb7a68a694b9b6086d02bf22c3e.tar.gz cpython-d6e8de179758bcb7a68a694b9b6086d02bf22c3e.tar.bz2 |
Issue #4916: fix little-endian UTF-16 decoding bug on big-endian UCS-4 builds, introduced by r68483.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index bc1612d..c668d0c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2791,16 +2791,24 @@ PyUnicode_DecodeUTF16Stateful(const char *s, _p[3] = 0; #endif #endif - ((unsigned char *) _p)[1] = _q[0]; - ((unsigned char *) _p)[0] = _q[1]; - ((unsigned char *) _p)[1 + Py_UNICODE_SIZE] = _q[2]; - ((unsigned char *) _p)[0 + Py_UNICODE_SIZE] = _q[3]; + /* Issue #4916; UCS-4 builds on big endian machines must + fill the two last bytes of each 4-byte unit. */ +#if (!defined(BYTEORDER_IS_LITTLE_ENDIAN) && Py_UNICODE_SIZE > 2) +# define OFF 2 +#else +# define OFF 0 +#endif + ((unsigned char *) _p)[OFF + 1] = _q[0]; + ((unsigned char *) _p)[OFF + 0] = _q[1]; + ((unsigned char *) _p)[OFF + 1 + Py_UNICODE_SIZE] = _q[2]; + ((unsigned char *) _p)[OFF + 0 + Py_UNICODE_SIZE] = _q[3]; #if (SIZEOF_LONG == 8) - ((unsigned char *) _p)[1 + 2 * Py_UNICODE_SIZE] = _q[4]; - ((unsigned char *) _p)[0 + 2 * Py_UNICODE_SIZE] = _q[5]; - ((unsigned char *) _p)[1 + 3 * Py_UNICODE_SIZE] = _q[6]; - ((unsigned char *) _p)[0 + 3 * Py_UNICODE_SIZE] = _q[7]; + ((unsigned char *) _p)[OFF + 1 + 2 * Py_UNICODE_SIZE] = _q[4]; + ((unsigned char *) _p)[OFF + 0 + 2 * Py_UNICODE_SIZE] = _q[5]; + ((unsigned char *) _p)[OFF + 1 + 3 * Py_UNICODE_SIZE] = _q[6]; + ((unsigned char *) _p)[OFF + 0 + 3 * Py_UNICODE_SIZE] = _q[7]; #endif +#undef OFF _q += SIZEOF_LONG; _p += SIZEOF_LONG / 2; } |