diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-05-15 13:17:54 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-15 13:17:54 +0800 |
commit | 982a17e02d99dcf6e4dff93110cff5ecc59247f5 (patch) | |
tree | 0e643bf8e5d59960b9cfdea4e4e2ab2d0216fa5a | |
parent | bd82a070cdebaede9b5287ba5285cf3e79f34dd3 (diff) | |
download | cpython-git-982a17e02d99dcf6e4dff93110cff5ecc59247f5.tar.gz |
bpo-30242: resolve some undefined behaviours in struct (#1418) (#1588)
-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 50fb1385bf..d83d57f2e8 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -506,7 +506,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; } @@ -814,6 +814,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; @@ -826,7 +827,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; @@ -837,6 +838,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; @@ -847,7 +849,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) return _range_error(f, 1); } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffUL); x >>= 8; } while (i > 0); return 0; @@ -1034,6 +1036,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; @@ -1046,7 +1049,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; @@ -1057,6 +1060,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; @@ -1067,7 +1071,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) return _range_error(f, 1); } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffUL); x >>= 8; } while (--i > 0); return 0; |