diff options
| author | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-11 02:59:42 +0100 |
|---|---|---|
| committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-11 02:59:42 +0100 |
| commit | 44c6affc796a84cb4b4e89eadd4c923958e9cc99 (patch) | |
| tree | b567f792ed34793e6042f84f509aa41b08368c13 /Objects/unicodeobject.c | |
| parent | 9768676f6f1cc0c7b2efcf3258ef300c0417dbcb (diff) | |
| download | cpython-git-44c6affc796a84cb4b4e89eadd4c923958e9cc99.tar.gz | |
Avoid crashing because of an unaligned word access
Diffstat (limited to 'Objects/unicodeobject.c')
| -rw-r--r-- | Objects/unicodeobject.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 772707de8b..a4d210bf40 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -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 ( |
