Skip to content

Commit 2954645

Browse files
committed
fix UBSan failures for arrayobject
1 parent 36bb229 commit 2954645

File tree

1 file changed

+50
-32
lines changed

1 file changed

+50
-32
lines changed

Modules/arraymodule.c

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ get_array_state(PyObject *module)
7979
#define get_array_state_by_class(cls) \
8080
(get_array_state(PyType_GetModule(cls)))
8181

82+
#define arrayobject_CAST(op) ((arrayobject *)(op))
83+
8284
enum machine_format_code {
8385
UNKNOWN_FORMAT = -1,
8486
/* UNKNOWN_FORMAT is used to indicate that the machine format for an
@@ -712,22 +714,25 @@ ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
712714
/* Methods */
713715

714716
static int
715-
array_tp_traverse(arrayobject *op, visitproc visit, void *arg)
717+
array_tp_traverse(PyObject *op, visitproc visit, void *arg)
716718
{
717719
Py_VISIT(Py_TYPE(op));
718720
return 0;
719721
}
720722

721723
static void
722-
array_dealloc(arrayobject *op)
724+
array_dealloc(PyObject *op)
723725
{
724726
PyTypeObject *tp = Py_TYPE(op);
725727
PyObject_GC_UnTrack(op);
726728

727-
if (op->weakreflist != NULL)
728-
PyObject_ClearWeakRefs((PyObject *) op);
729-
if (op->ob_item != NULL)
730-
PyMem_Free(op->ob_item);
729+
arrayobject *self = arrayobject_CAST(op);
730+
if (self->weakreflist != NULL) {
731+
PyObject_ClearWeakRefs(op);
732+
}
733+
if (self->ob_item != NULL) {
734+
PyMem_Free(self->ob_item);
735+
}
731736
tp->tp_free(op);
732737
Py_DECREF(tp);
733738
}
@@ -843,19 +848,19 @@ array_richcompare(PyObject *v, PyObject *w, int op)
843848
}
844849

845850
static Py_ssize_t
846-
array_length(arrayobject *a)
851+
array_length(PyObject *op)
847852
{
848-
return Py_SIZE(a);
853+
return Py_SIZE(op);
849854
}
850855

851856
static PyObject *
852-
array_item(arrayobject *a, Py_ssize_t i)
857+
array_item(PyObject *op, Py_ssize_t i)
853858
{
854-
if (i < 0 || i >= Py_SIZE(a)) {
859+
if (i < 0 || i >= Py_SIZE(op)) {
855860
PyErr_SetString(PyExc_IndexError, "array index out of range");
856861
return NULL;
857862
}
858-
return getarrayitem((PyObject *)a, i);
863+
return getarrayitem(op, i);
859864
}
860865

861866
static PyObject *
@@ -930,8 +935,9 @@ array_array___deepcopy__(arrayobject *self, PyObject *unused)
930935
}
931936

932937
static PyObject *
933-
array_concat(arrayobject *a, PyObject *bb)
938+
array_concat(PyObject *op, PyObject *bb)
934939
{
940+
arrayobject *a = arrayobject_CAST(op);
935941
array_state *state = find_array_state_by_type(Py_TYPE(a));
936942
Py_ssize_t size;
937943
arrayobject *np;
@@ -966,8 +972,9 @@ array_concat(arrayobject *a, PyObject *bb)
966972
}
967973

968974
static PyObject *
969-
array_repeat(arrayobject *a, Py_ssize_t n)
975+
array_repeat(PyObject *op, Py_ssize_t n)
970976
{
977+
arrayobject *a = arrayobject_CAST(op);
971978
array_state *state = find_array_state_by_type(Py_TYPE(a));
972979

973980
if (n < 0)
@@ -1026,8 +1033,9 @@ array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
10261033
}
10271034

10281035
static int
1029-
array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
1036+
array_ass_item(PyObject *op, Py_ssize_t i, PyObject *v)
10301037
{
1038+
arrayobject *a = arrayobject_CAST(op);
10311039
if (i < 0 || i >= Py_SIZE(a)) {
10321040
PyErr_SetString(PyExc_IndexError,
10331041
"array assignment index out of range");
@@ -1045,7 +1053,7 @@ setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
10451053
array_state *state = find_array_state_by_type(Py_TYPE(a));
10461054
assert(array_Check(a, state));
10471055
#endif
1048-
return array_ass_item((arrayobject *)a, i, v);
1056+
return array_ass_item(a, i, v);
10491057
}
10501058

10511059
static int
@@ -1105,8 +1113,9 @@ array_do_extend(array_state *state, arrayobject *self, PyObject *bb)
11051113
}
11061114

11071115
static PyObject *
1108-
array_inplace_concat(arrayobject *self, PyObject *bb)
1116+
array_inplace_concat(PyObject *op, PyObject *bb)
11091117
{
1118+
arrayobject *self = arrayobject_CAST(op);
11101119
array_state *state = find_array_state_by_type(Py_TYPE(self));
11111120

11121121
if (!array_Check(bb, state)) {
@@ -1121,8 +1130,9 @@ array_inplace_concat(arrayobject *self, PyObject *bb)
11211130
}
11221131

11231132
static PyObject *
1124-
array_inplace_repeat(arrayobject *self, Py_ssize_t n)
1133+
array_inplace_repeat(PyObject *op, Py_ssize_t n)
11251134
{
1135+
arrayobject *self = arrayobject_CAST(op);
11261136
const Py_ssize_t array_size = Py_SIZE(self);
11271137

11281138
if (array_size > 0 && n != 1 ) {
@@ -1236,13 +1246,13 @@ array_array_index_impl(arrayobject *self, PyObject *v, Py_ssize_t start,
12361246
}
12371247

12381248
static int
1239-
array_contains(arrayobject *self, PyObject *v)
1249+
array_contains(PyObject *self, PyObject *v)
12401250
{
12411251
Py_ssize_t i;
12421252
int cmp;
12431253

12441254
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1245-
PyObject *selfi = getarrayitem((PyObject *)self, i);
1255+
PyObject *selfi = getarrayitem(self, i);
12461256
if (selfi == NULL)
12471257
return -1;
12481258
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
@@ -2349,22 +2359,24 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
23492359
}
23502360

23512361
static PyObject *
2352-
array_get_typecode(arrayobject *a, void *closure)
2362+
array_get_typecode(PyObject *op, void *Py_UNUSED(closure))
23532363
{
2364+
arrayobject *a = arrayobject_CAST(op);
23542365
char typecode = a->ob_descr->typecode;
23552366
return PyUnicode_FromOrdinal(typecode);
23562367
}
23572368

23582369
static PyObject *
2359-
array_get_itemsize(arrayobject *a, void *closure)
2370+
array_get_itemsize(PyObject *op, void *Py_UNUSED(closure))
23602371
{
2372+
arrayobject *a = arrayobject_CAST(op);
23612373
return PyLong_FromLong((long)a->ob_descr->itemsize);
23622374
}
23632375

23642376
static PyGetSetDef array_getsets [] = {
2365-
{"typecode", (getter) array_get_typecode, NULL,
2377+
{"typecode", array_get_typecode, NULL,
23662378
"the typecode character used to create the array"},
2367-
{"itemsize", (getter) array_get_itemsize, NULL,
2379+
{"itemsize", array_get_itemsize, NULL,
23682380
"the size, in bytes, of one array item"},
23692381
{NULL}
23702382
};
@@ -2398,11 +2410,12 @@ static PyMethodDef array_methods[] = {
23982410
};
23992411

24002412
static PyObject *
2401-
array_repr(arrayobject *a)
2413+
array_repr(PyObject *op)
24022414
{
24032415
char typecode;
24042416
PyObject *s, *v = NULL;
24052417
Py_ssize_t len;
2418+
arrayobject *a = arrayobject_CAST(op);
24062419

24072420
len = Py_SIZE(a);
24082421
typecode = a->ob_descr->typecode;
@@ -2425,8 +2438,9 @@ array_repr(arrayobject *a)
24252438
}
24262439

24272440
static PyObject*
2428-
array_subscr(arrayobject* self, PyObject* item)
2441+
array_subscr(PyObject *op, PyObject *item)
24292442
{
2443+
arrayobject *self = arrayobject_CAST(op);
24302444
array_state *state = find_array_state_by_type(Py_TYPE(self));
24312445

24322446
if (PyIndex_Check(item)) {
@@ -2436,7 +2450,7 @@ array_subscr(arrayobject* self, PyObject* item)
24362450
}
24372451
if (i < 0)
24382452
i += Py_SIZE(self);
2439-
return array_item(self, i);
2453+
return array_item(op, i);
24402454
}
24412455
else if (PySlice_Check(item)) {
24422456
Py_ssize_t start, stop, step, slicelength, i;
@@ -2488,9 +2502,10 @@ array_subscr(arrayobject* self, PyObject* item)
24882502
}
24892503

24902504
static int
2491-
array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2505+
array_ass_subscr(PyObject *op, PyObject *item, PyObject *value)
24922506
{
24932507
Py_ssize_t start, stop, step, slicelength, needed;
2508+
arrayobject *self = arrayobject_CAST(op);
24942509
array_state* state = find_array_state_by_type(Py_TYPE(self));
24952510
arrayobject* other;
24962511
int itemsize;
@@ -2542,7 +2557,7 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
25422557
value = array_slice(other, 0, needed);
25432558
if (value == NULL)
25442559
return -1;
2545-
ret = array_ass_subscr(self, item, value);
2560+
ret = array_ass_subscr(op, item, value);
25462561
Py_DECREF(value);
25472562
return ret;
25482563
}
@@ -2649,14 +2664,15 @@ static const void *emptybuf = "";
26492664

26502665

26512666
static int
2652-
array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
2667+
array_buffer_getbuf(PyObject *op, Py_buffer *view, int flags)
26532668
{
26542669
if (view == NULL) {
26552670
PyErr_SetString(PyExc_BufferError,
26562671
"array_buffer_getbuf: view==NULL argument is obsolete");
26572672
return -1;
26582673
}
26592674

2675+
arrayobject *self = arrayobject_CAST(op);
26602676
view->buf = (void *)self->ob_item;
26612677
view->obj = Py_NewRef(self);
26622678
if (view->buf == NULL)
@@ -2689,8 +2705,9 @@ array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
26892705
}
26902706

26912707
static void
2692-
array_buffer_relbuf(arrayobject *self, Py_buffer *view)
2708+
array_buffer_relbuf(PyObject *op, Py_buffer *Py_UNUSED(view))
26932709
{
2710+
arrayobject *self = arrayobject_CAST(op);
26942711
self->ob_exports--;
26952712
}
26962713

@@ -2925,7 +2942,7 @@ typecode -- the typecode character used to create the array\n\
29252942
itemsize -- the length in bytes of one array item\n\
29262943
");
29272944

2928-
static PyObject *array_iter(arrayobject *ao);
2945+
static PyObject *array_iter(PyObject *op);
29292946

29302947
static struct PyMemberDef array_members[] = {
29312948
{"__weaklistoffset__", Py_T_PYSSIZET, offsetof(arrayobject, weakreflist), Py_READONLY},
@@ -2985,8 +3002,9 @@ class array.arrayiterator "arrayiterobject *" "find_array_state_by_type(type)->A
29853002
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=fb46d5ef98dd95ff]*/
29863003

29873004
static PyObject *
2988-
array_iter(arrayobject *ao)
3005+
array_iter(PyObject *op)
29893006
{
3007+
arrayobject *ao = arrayobject_CAST(op);
29903008
array_state *state = find_array_state_by_type(Py_TYPE(ao));
29913009
arrayiterobject *it;
29923010

0 commit comments

Comments
 (0)