]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
promote some shifts to unsigned, so as not to invoke undefined behavior
authorBenjamin Peterson <benjamin@python.org>
Wed, 7 Sep 2016 03:40:04 +0000 (20:40 -0700)
committerBenjamin Peterson <benjamin@python.org>
Wed, 7 Sep 2016 03:40:04 +0000 (20:40 -0700)
Objects/unicodeobject.c

index 1fcc83e63a3240e4405109e91e224c3ddcb9a72e..af045646c84a508f9186a85db6516a8fc0ac9f18 100644 (file)
@@ -4944,7 +4944,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
        mark is skipped, in all other modes, it is copied to the output
        stream as-is (giving a ZWNBSP character). */
     if (bo == 0 && size >= 4) {
-        Py_UCS4 bom = (q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
+        Py_UCS4 bom = ((unsigned int)q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
         if (bom == 0x0000FEFF) {
             bo = -1;
             q += 4;
@@ -4986,7 +4986,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
             Py_ssize_t pos = writer.pos;
             if (le) {
                 do {
-                    ch = (q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
+                    ch = ((unsigned int)q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
                     if (ch > maxch)
                         break;
                     if (kind != PyUnicode_1BYTE_KIND &&
@@ -4998,7 +4998,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
             }
             else {
                 do {
-                    ch = (q[0] << 24) | (q[1] << 16) | (q[2] << 8) | q[3];
+                    ch = ((unsigned int)q[0] << 24) | (q[1] << 16) | (q[2] << 8) | q[3];
                     if (ch > maxch)
                         break;
                     if (kind != PyUnicode_1BYTE_KIND &&