diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-05-15 05:17:28 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-15 05:17:28 (GMT) |
commit | aad1caf55f7fadb00ee097a1465bece4e128d8ef (patch) | |
tree | d0ddf2c5103bf320b86da0442c33e4a599d422e5 /Modules | |
parent | 0ce1f7e02d4102e8a459d1855d689c8e4613a327 (diff) | |
download | cpython-aad1caf55f7fadb00ee097a1465bece4e128d8ef.zip cpython-aad1caf55f7fadb00ee097a1465bece4e128d8ef.tar.gz cpython-aad1caf55f7fadb00ee097a1465bece4e128d8ef.tar.bz2 |
bpo-30242: resolve some undefined behaviours in struct (#1418) (#1586)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_struct.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c index 796d168..2635af9 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -539,7 +539,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) "ubyte format requires 0 <= number <= 255"); return -1; } - *p = (char)x; + *(unsigned char *)p = (unsigned char)x; return 0; } @@ -868,6 +868,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -880,7 +881,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffL); x >>= 8; } while (i > 0); return 0; @@ -891,6 +892,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -901,7 +903,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffUL); x >>= 8; } while (i > 0); return 0; @@ -1087,6 +1089,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -1099,7 +1102,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffL); x >>= 8; } while (--i > 0); return 0; @@ -1110,6 +1113,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -1120,7 +1124,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffUL); x >>= 8; } while (--i > 0); return 0; |