summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-01-11 23:56:55 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-01-11 23:56:55 (GMT)
commitd6e8de179758bcb7a68a694b9b6086d02bf22c3e (patch)
tree0d86b6c30f3840cf895747dd37d24341f9e2510f
parenta4a37fefb645316c2694f9ef50fa3bbddb41d0ba (diff)
downloadcpython-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.
-rw-r--r--Objects/unicodeobject.c24
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;
}