Avoid crashing because of an unaligned word access
authorAntoine Pitrou <solipsis@pitrou.net>
Fri, 11 Nov 2011 01:59:42 +0000 (02:59 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Fri, 11 Nov 2011 01:59:42 +0000 (02:59 +0100)
Objects/unicodeobject.c

index 772707de8b60909d9366e035ea2130b30e3d0c30..a4d210bf40ce20721c3c1955e84fb679386dee5a 100644 (file)
@@ -6252,7 +6252,15 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
     end = s + size;
 
     while (s < end) {
-        Py_UCS4 ch = *(Py_UNICODE*)s;
+        Py_UCS4 ch;
+        /* We copy the raw representation one byte at a time because the
+           pointer may be unaligned (see test_codeccallbacks). */
+        ((char *) &ch)[0] = s[0];
+        ((char *) &ch)[1] = s[1];
+#ifdef Py_UNICODE_WIDE
+        ((char *) &ch)[2] = s[2];
+        ((char *) &ch)[3] = s[3];
+#endif
         /* We have to sanity check the raw data, otherwise doom looms for
            some malformed UCS-4 data. */
         if (