Skip to content

Commit 982a17e

Browse files
authored
bpo-30242: resolve some undefined behaviours in struct (#1418) (#1588)
1 parent bd82a07 commit 982a17e

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

Modules/_struct.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f)
506506
"ubyte format requires 0 <= number <= 255");
507507
return -1;
508508
}
509-
*p = (char)x;
509+
*(unsigned char *)p = (unsigned char)x;
510510
return 0;
511511
}
512512

@@ -814,6 +814,7 @@ bp_int(char *p, PyObject *v, const formatdef *f)
814814
{
815815
long x;
816816
Py_ssize_t i;
817+
unsigned char *q = (unsigned char *)p;
817818
if (get_long(v, &x) < 0)
818819
return -1;
819820
i = f->size;
@@ -826,7 +827,7 @@ bp_int(char *p, PyObject *v, const formatdef *f)
826827
#endif
827828
}
828829
do {
829-
p[--i] = (char)x;
830+
q[--i] = (unsigned char)(x & 0xffL);
830831
x >>= 8;
831832
} while (i > 0);
832833
return 0;
@@ -837,6 +838,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f)
837838
{
838839
unsigned long x;
839840
Py_ssize_t i;
841+
unsigned char *q = (unsigned char *)p;
840842
if (get_ulong(v, &x) < 0)
841843
return -1;
842844
i = f->size;
@@ -847,7 +849,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f)
847849
return _range_error(f, 1);
848850
}
849851
do {
850-
p[--i] = (char)x;
852+
q[--i] = (unsigned char)(x & 0xffUL);
851853
x >>= 8;
852854
} while (i > 0);
853855
return 0;
@@ -1034,6 +1036,7 @@ lp_int(char *p, PyObject *v, const formatdef *f)
10341036
{
10351037
long x;
10361038
Py_ssize_t i;
1039+
unsigned char *q = (unsigned char *)p;
10371040
if (get_long(v, &x) < 0)
10381041
return -1;
10391042
i = f->size;
@@ -1046,7 +1049,7 @@ lp_int(char *p, PyObject *v, const formatdef *f)
10461049
#endif
10471050
}
10481051
do {
1049-
*p++ = (char)x;
1052+
*q++ = (unsigned char)(x & 0xffL);
10501053
x >>= 8;
10511054
} while (--i > 0);
10521055
return 0;
@@ -1057,6 +1060,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f)
10571060
{
10581061
unsigned long x;
10591062
Py_ssize_t i;
1063+
unsigned char *q = (unsigned char *)p;
10601064
if (get_ulong(v, &x) < 0)
10611065
return -1;
10621066
i = f->size;
@@ -1067,7 +1071,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f)
10671071
return _range_error(f, 1);
10681072
}
10691073
do {
1070-
*p++ = (char)x;
1074+
*q++ = (unsigned char)(x & 0xffUL);
10711075
x >>= 8;
10721076
} while (--i > 0);
10731077
return 0;

0 commit comments

Comments
 (0)