Skip to content

Commit 624b93e

Browse files
authored
gh-111178: fix UBSan failures in Modules/arraymodule.c (GH-129772)
* fix UBSan failures for `arrayobject`, `arrayiterobject` * suppress unused return values
1 parent 1988003 commit 624b93e

File tree

1 file changed

+59
-40
lines changed

1 file changed

+59
-40
lines changed

Modules/arraymodule.c

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ 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+
#define arrayiterobject_CAST(op) ((arrayiterobject *)(op))
84+
8285
enum machine_format_code {
8386
UNKNOWN_FORMAT = -1,
8487
/* UNKNOWN_FORMAT is used to indicate that the machine format for an
@@ -712,22 +715,25 @@ ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
712715
/* Methods */
713716

714717
static int
715-
array_tp_traverse(arrayobject *op, visitproc visit, void *arg)
718+
array_tp_traverse(PyObject *op, visitproc visit, void *arg)
716719
{
717720
Py_VISIT(Py_TYPE(op));
718721
return 0;
719722
}
720723

721724
static void
722-
array_dealloc(arrayobject *op)
725+
array_dealloc(PyObject *op)
723726
{
724727
PyTypeObject *tp = Py_TYPE(op);
725728
PyObject_GC_UnTrack(op);
726729

727-
if (op->weakreflist != NULL)
728-
PyObject_ClearWeakRefs((PyObject *) op);
729-
if (op->ob_item != NULL)
730-
PyMem_Free(op->ob_item);
730+
arrayobject *self = arrayobject_CAST(op);
731+
if (self->weakreflist != NULL) {
732+
PyObject_ClearWeakRefs(op);
733+
}
734+
if (self->ob_item != NULL) {
735+
PyMem_Free(self->ob_item);
736+
}
731737
tp->tp_free(op);
732738
Py_DECREF(tp);
733739
}
@@ -843,19 +849,19 @@ array_richcompare(PyObject *v, PyObject *w, int op)
843849
}
844850

845851
static Py_ssize_t
846-
array_length(arrayobject *a)
852+
array_length(PyObject *op)
847853
{
848-
return Py_SIZE(a);
854+
return Py_SIZE(op);
849855
}
850856

851857
static PyObject *
852-
array_item(arrayobject *a, Py_ssize_t i)
858+
array_item(PyObject *op, Py_ssize_t i)
853859
{
854-
if (i < 0 || i >= Py_SIZE(a)) {
860+
if (i < 0 || i >= Py_SIZE(op)) {
855861
PyErr_SetString(PyExc_IndexError, "array index out of range");
856862
return NULL;
857863
}
858-
return getarrayitem((PyObject *)a, i);
864+
return getarrayitem(op, i);
859865
}
860866

861867
static PyObject *
@@ -930,8 +936,9 @@ array_array___deepcopy__(arrayobject *self, PyObject *unused)
930936
}
931937

932938
static PyObject *
933-
array_concat(arrayobject *a, PyObject *bb)
939+
array_concat(PyObject *op, PyObject *bb)
934940
{
941+
arrayobject *a = arrayobject_CAST(op);
935942
array_state *state = find_array_state_by_type(Py_TYPE(a));
936943
Py_ssize_t size;
937944
arrayobject *np;
@@ -966,8 +973,9 @@ array_concat(arrayobject *a, PyObject *bb)
966973
}
967974

968975
static PyObject *
969-
array_repeat(arrayobject *a, Py_ssize_t n)
976+
array_repeat(PyObject *op, Py_ssize_t n)
970977
{
978+
arrayobject *a = arrayobject_CAST(op);
971979
array_state *state = find_array_state_by_type(Py_TYPE(a));
972980

973981
if (n < 0)
@@ -1026,8 +1034,9 @@ array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
10261034
}
10271035

10281036
static int
1029-
array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
1037+
array_ass_item(PyObject *op, Py_ssize_t i, PyObject *v)
10301038
{
1039+
arrayobject *a = arrayobject_CAST(op);
10311040
if (i < 0 || i >= Py_SIZE(a)) {
10321041
PyErr_SetString(PyExc_IndexError,
10331042
"array assignment index out of range");
@@ -1045,7 +1054,7 @@ setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
10451054
array_state *state = find_array_state_by_type(Py_TYPE(a));
10461055
assert(array_Check(a, state));
10471056
#endif
1048-
return array_ass_item((arrayobject *)a, i, v);
1057+
return array_ass_item(a, i, v);
10491058
}
10501059

10511060
static int
@@ -1105,8 +1114,9 @@ array_do_extend(array_state *state, arrayobject *self, PyObject *bb)
11051114
}
11061115

11071116
static PyObject *
1108-
array_inplace_concat(arrayobject *self, PyObject *bb)
1117+
array_inplace_concat(PyObject *op, PyObject *bb)
11091118
{
1119+
arrayobject *self = arrayobject_CAST(op);
11101120
array_state *state = find_array_state_by_type(Py_TYPE(self));
11111121

11121122
if (!array_Check(bb, state)) {
@@ -1121,8 +1131,9 @@ array_inplace_concat(arrayobject *self, PyObject *bb)
11211131
}
11221132

11231133
static PyObject *
1124-
array_inplace_repeat(arrayobject *self, Py_ssize_t n)
1134+
array_inplace_repeat(PyObject *op, Py_ssize_t n)
11251135
{
1136+
arrayobject *self = arrayobject_CAST(op);
11261137
const Py_ssize_t array_size = Py_SIZE(self);
11271138

11281139
if (array_size > 0 && n != 1 ) {
@@ -1236,13 +1247,13 @@ array_array_index_impl(arrayobject *self, PyObject *v, Py_ssize_t start,
12361247
}
12371248

12381249
static int
1239-
array_contains(arrayobject *self, PyObject *v)
1250+
array_contains(PyObject *self, PyObject *v)
12401251
{
12411252
Py_ssize_t i;
12421253
int cmp;
12431254

12441255
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1245-
PyObject *selfi = getarrayitem((PyObject *)self, i);
1256+
PyObject *selfi = getarrayitem(self, i);
12461257
if (selfi == NULL)
12471258
return -1;
12481259
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
@@ -2349,22 +2360,24 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
23492360
}
23502361

23512362
static PyObject *
2352-
array_get_typecode(arrayobject *a, void *closure)
2363+
array_get_typecode(PyObject *op, void *Py_UNUSED(closure))
23532364
{
2365+
arrayobject *a = arrayobject_CAST(op);
23542366
char typecode = a->ob_descr->typecode;
23552367
return PyUnicode_FromOrdinal(typecode);
23562368
}
23572369

23582370
static PyObject *
2359-
array_get_itemsize(arrayobject *a, void *closure)
2371+
array_get_itemsize(PyObject *op, void *Py_UNUSED(closure))
23602372
{
2373+
arrayobject *a = arrayobject_CAST(op);
23612374
return PyLong_FromLong((long)a->ob_descr->itemsize);
23622375
}
23632376

23642377
static PyGetSetDef array_getsets [] = {
2365-
{"typecode", (getter) array_get_typecode, NULL,
2378+
{"typecode", array_get_typecode, NULL,
23662379
"the typecode character used to create the array"},
2367-
{"itemsize", (getter) array_get_itemsize, NULL,
2380+
{"itemsize", array_get_itemsize, NULL,
23682381
"the size, in bytes, of one array item"},
23692382
{NULL}
23702383
};
@@ -2398,11 +2411,12 @@ static PyMethodDef array_methods[] = {
23982411
};
23992412

24002413
static PyObject *
2401-
array_repr(arrayobject *a)
2414+
array_repr(PyObject *op)
24022415
{
24032416
char typecode;
24042417
PyObject *s, *v = NULL;
24052418
Py_ssize_t len;
2419+
arrayobject *a = arrayobject_CAST(op);
24062420

24072421
len = Py_SIZE(a);
24082422
typecode = a->ob_descr->typecode;
@@ -2425,8 +2439,9 @@ array_repr(arrayobject *a)
24252439
}
24262440

24272441
static PyObject*
2428-
array_subscr(arrayobject* self, PyObject* item)
2442+
array_subscr(PyObject *op, PyObject *item)
24292443
{
2444+
arrayobject *self = arrayobject_CAST(op);
24302445
array_state *state = find_array_state_by_type(Py_TYPE(self));
24312446

24322447
if (PyIndex_Check(item)) {
@@ -2436,7 +2451,7 @@ array_subscr(arrayobject* self, PyObject* item)
24362451
}
24372452
if (i < 0)
24382453
i += Py_SIZE(self);
2439-
return array_item(self, i);
2454+
return array_item(op, i);
24402455
}
24412456
else if (PySlice_Check(item)) {
24422457
Py_ssize_t start, stop, step, slicelength, i;
@@ -2488,9 +2503,10 @@ array_subscr(arrayobject* self, PyObject* item)
24882503
}
24892504

24902505
static int
2491-
array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2506+
array_ass_subscr(PyObject *op, PyObject *item, PyObject *value)
24922507
{
24932508
Py_ssize_t start, stop, step, slicelength, needed;
2509+
arrayobject *self = arrayobject_CAST(op);
24942510
array_state* state = find_array_state_by_type(Py_TYPE(self));
24952511
arrayobject* other;
24962512
int itemsize;
@@ -2542,7 +2558,7 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
25422558
value = array_slice(other, 0, needed);
25432559
if (value == NULL)
25442560
return -1;
2545-
ret = array_ass_subscr(self, item, value);
2561+
ret = array_ass_subscr(op, item, value);
25462562
Py_DECREF(value);
25472563
return ret;
25482564
}
@@ -2649,14 +2665,15 @@ static const void *emptybuf = "";
26492665

26502666

26512667
static int
2652-
array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
2668+
array_buffer_getbuf(PyObject *op, Py_buffer *view, int flags)
26532669
{
26542670
if (view == NULL) {
26552671
PyErr_SetString(PyExc_BufferError,
26562672
"array_buffer_getbuf: view==NULL argument is obsolete");
26572673
return -1;
26582674
}
26592675

2676+
arrayobject *self = arrayobject_CAST(op);
26602677
view->buf = (void *)self->ob_item;
26612678
view->obj = Py_NewRef(self);
26622679
if (view->buf == NULL)
@@ -2689,8 +2706,9 @@ array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
26892706
}
26902707

26912708
static void
2692-
array_buffer_relbuf(arrayobject *self, Py_buffer *view)
2709+
array_buffer_relbuf(PyObject *op, Py_buffer *Py_UNUSED(view))
26932710
{
2711+
arrayobject *self = arrayobject_CAST(op);
26942712
self->ob_exports--;
26952713
}
26962714

@@ -2925,7 +2943,7 @@ typecode -- the typecode character used to create the array\n\
29252943
itemsize -- the length in bytes of one array item\n\
29262944
");
29272945

2928-
static PyObject *array_iter(arrayobject *ao);
2946+
static PyObject *array_iter(PyObject *op);
29292947

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

29873005
static PyObject *
2988-
array_iter(arrayobject *ao)
3006+
array_iter(PyObject *op)
29893007
{
3008+
arrayobject *ao = arrayobject_CAST(op);
29903009
array_state *state = find_array_state_by_type(Py_TYPE(ao));
29913010
arrayiterobject *it;
29923011

@@ -3007,16 +3026,15 @@ array_iter(arrayobject *ao)
30073026
}
30083027

30093028
static PyObject *
3010-
arrayiter_next(arrayiterobject *it)
3029+
arrayiter_next(PyObject *op)
30113030
{
3012-
arrayobject *ao;
3013-
3031+
arrayiterobject *it = arrayiterobject_CAST(op);
30143032
assert(it != NULL);
30153033
#ifndef NDEBUG
30163034
array_state *state = find_array_state_by_type(Py_TYPE(it));
30173035
assert(PyObject_TypeCheck(it, state->ArrayIterType));
30183036
#endif
3019-
ao = it->ao;
3037+
arrayobject *ao = it->ao;
30203038
if (ao == NULL) {
30213039
return NULL;
30223040
}
@@ -3032,19 +3050,20 @@ arrayiter_next(arrayiterobject *it)
30323050
}
30333051

30343052
static void
3035-
arrayiter_dealloc(arrayiterobject *it)
3053+
arrayiter_dealloc(PyObject *op)
30363054
{
3055+
arrayiterobject *it = arrayiterobject_CAST(op);
30373056
PyTypeObject *tp = Py_TYPE(it);
3038-
30393057
PyObject_GC_UnTrack(it);
30403058
Py_XDECREF(it->ao);
30413059
PyObject_GC_Del(it);
30423060
Py_DECREF(tp);
30433061
}
30443062

30453063
static int
3046-
arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
3064+
arrayiter_traverse(PyObject *op, visitproc visit, void *arg)
30473065
{
3066+
arrayiterobject *it = arrayiterobject_CAST(op);
30483067
Py_VISIT(Py_TYPE(it));
30493068
Py_VISIT(it->ao);
30503069
return 0;
@@ -3156,7 +3175,7 @@ array_clear(PyObject *module)
31563175
static void
31573176
array_free(void *module)
31583177
{
3159-
array_clear((PyObject *)module);
3178+
(void)array_clear((PyObject *)module);
31603179
}
31613180

31623181
/* No functions in array module. */

0 commit comments

Comments
 (0)