bpo-30242: resolve some undefined behaviours in struct (#1418) (#1587) · python/cpython@dd2a09c (original) (raw)
`@@ -519,7 +519,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f)
`
519
519
`"ubyte format requires 0 <= number <= 255");
`
520
520
`return -1;
`
521
521
` }
`
522
``
`-
*p = (char)x;
`
``
522
`+
*(unsigned char *)p = (unsigned char)x;
`
523
523
`return 0;
`
524
524
`}
`
525
525
``
`@@ -850,6 +850,7 @@ bp_int(char *p, PyObject *v, const formatdef *f)
`
850
850
`{
`
851
851
`long x;
`
852
852
`Py_ssize_t i;
`
``
853
`+
unsigned char *q = (unsigned char *)p;
`
853
854
`if (get_long(v, &x) < 0)
`
854
855
`return -1;
`
855
856
`i = f->size;
`
`@@ -862,7 +863,7 @@ bp_int(char *p, PyObject *v, const formatdef *f)
`
862
863
`#endif
`
863
864
` }
`
864
865
`do {
`
865
``
`-
p[--i] = (char)x;
`
``
866
`+
q[--i] = (unsigned char)(x & 0xffL);
`
866
867
`x >>= 8;
`
867
868
` } while (i > 0);
`
868
869
`return 0;
`
`@@ -873,6 +874,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f)
`
873
874
`{
`
874
875
`unsigned long x;
`
875
876
`Py_ssize_t i;
`
``
877
`+
unsigned char *q = (unsigned char *)p;
`
876
878
`if (get_ulong(v, &x) < 0)
`
877
879
`return -1;
`
878
880
`i = f->size;
`
`@@ -883,7 +885,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f)
`
883
885
`RANGE_ERROR(x, f, 1, maxint - 1);
`
884
886
` }
`
885
887
`do {
`
886
``
`-
p[--i] = (char)x;
`
``
888
`+
q[--i] = (unsigned char)(x & 0xffUL);
`
887
889
`x >>= 8;
`
888
890
` } while (i > 0);
`
889
891
`return 0;
`
`@@ -1070,6 +1072,7 @@ lp_int(char *p, PyObject *v, const formatdef *f)
`
1070
1072
`{
`
1071
1073
`long x;
`
1072
1074
`Py_ssize_t i;
`
``
1075
`+
unsigned char *q = (unsigned char *)p;
`
1073
1076
`if (get_long(v, &x) < 0)
`
1074
1077
`return -1;
`
1075
1078
`i = f->size;
`
`@@ -1082,7 +1085,7 @@ lp_int(char *p, PyObject *v, const formatdef *f)
`
1082
1085
`#endif
`
1083
1086
` }
`
1084
1087
`do {
`
1085
``
`-
*p++ = (char)x;
`
``
1088
`+
*q++ = (unsigned char)(x & 0xffL);
`
1086
1089
`x >>= 8;
`
1087
1090
` } while (--i > 0);
`
1088
1091
`return 0;
`
`@@ -1093,6 +1096,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f)
`
1093
1096
`{
`
1094
1097
`unsigned long x;
`
1095
1098
`Py_ssize_t i;
`
``
1099
`+
unsigned char *q = (unsigned char *)p;
`
1096
1100
`if (get_ulong(v, &x) < 0)
`
1097
1101
`return -1;
`
1098
1102
`i = f->size;
`
`@@ -1103,7 +1107,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f)
`
1103
1107
`RANGE_ERROR(x, f, 1, maxint - 1);
`
1104
1108
` }
`
1105
1109
`do {
`
1106
``
`-
*p++ = (char)x;
`
``
1110
`+
*q++ = (unsigned char)(x & 0xffUL);
`
1107
1111
`x >>= 8;
`
1108
1112
` } while (--i > 0);
`
1109
1113
`return 0;
`