summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
authorXiang Zhang <angwerzx@126.com>2017-05-15 13:17:54 +0800
committerGitHub <noreply@github.com>2017-05-15 13:17:54 +0800
commit982a17e02d99dcf6e4dff93110cff5ecc59247f5 (patch)
tree0e643bf8e5d59960b9cfdea4e4e2ab2d0216fa5a /Modules
parentbd82a070cdebaede9b5287ba5285cf3e79f34dd3 (diff)
downloadcpython-git-982a17e02d99dcf6e4dff93110cff5ecc59247f5.tar.gz
bpo-30242: resolve some undefined behaviours in struct (#1418) (#1588)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_struct.c14
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;