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;

`