Skip to content

Commit 15ff46d

Browse files
picnixzWolframAlph
authored andcommitted
pythongh-111178: fix UBSan failures in Objects/tupleobject.c (pythonGH-128251)
fix UBSan failures for `_PyTupleIterObject`
1 parent ee62277 commit 15ff46d

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

Objects/tupleobject.c

+20-14
Original file line numberDiff line numberDiff line change
@@ -988,26 +988,29 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
988988

989989
/*********************** Tuple Iterator **************************/
990990

991+
#define _PyTupleIterObject_CAST(op) ((_PyTupleIterObject *)(op))
991992

992993
static void
993-
tupleiter_dealloc(_PyTupleIterObject *it)
994+
tupleiter_dealloc(PyObject *self)
994995
{
996+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
995997
_PyObject_GC_UNTRACK(it);
996998
Py_XDECREF(it->it_seq);
997999
PyObject_GC_Del(it);
9981000
}
9991001

10001002
static int
1001-
tupleiter_traverse(_PyTupleIterObject *it, visitproc visit, void *arg)
1003+
tupleiter_traverse(PyObject *self, visitproc visit, void *arg)
10021004
{
1005+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
10031006
Py_VISIT(it->it_seq);
10041007
return 0;
10051008
}
10061009

10071010
static PyObject *
1008-
tupleiter_next(PyObject *obj)
1011+
tupleiter_next(PyObject *self)
10091012
{
1010-
_PyTupleIterObject *it = (_PyTupleIterObject *)obj;
1013+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
10111014
PyTupleObject *seq;
10121015
PyObject *item;
10131016

@@ -1029,8 +1032,9 @@ tupleiter_next(PyObject *obj)
10291032
}
10301033

10311034
static PyObject *
1032-
tupleiter_len(_PyTupleIterObject *it, PyObject *Py_UNUSED(ignored))
1035+
tupleiter_len(PyObject *self, PyObject *Py_UNUSED(ignored))
10331036
{
1037+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
10341038
Py_ssize_t len = 0;
10351039
if (it->it_seq)
10361040
len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
@@ -1040,13 +1044,14 @@ tupleiter_len(_PyTupleIterObject *it, PyObject *Py_UNUSED(ignored))
10401044
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
10411045

10421046
static PyObject *
1043-
tupleiter_reduce(_PyTupleIterObject *it, PyObject *Py_UNUSED(ignored))
1047+
tupleiter_reduce(PyObject *self, PyObject *Py_UNUSED(ignored))
10441048
{
10451049
PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
10461050

10471051
/* _PyEval_GetBuiltin can invoke arbitrary code,
10481052
* call must be before access of iterator pointers.
10491053
* see issue #101765 */
1054+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
10501055

10511056
if (it->it_seq)
10521057
return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
@@ -1055,8 +1060,9 @@ tupleiter_reduce(_PyTupleIterObject *it, PyObject *Py_UNUSED(ignored))
10551060
}
10561061

10571062
static PyObject *
1058-
tupleiter_setstate(_PyTupleIterObject *it, PyObject *state)
1063+
tupleiter_setstate(PyObject *self, PyObject *state)
10591064
{
1065+
_PyTupleIterObject *it = _PyTupleIterObject_CAST(self);
10601066
Py_ssize_t index = PyLong_AsSsize_t(state);
10611067
if (index == -1 && PyErr_Occurred())
10621068
return NULL;
@@ -1074,19 +1080,19 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
10741080
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
10751081

10761082
static PyMethodDef tupleiter_methods[] = {
1077-
{"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
1078-
{"__reduce__", (PyCFunction)tupleiter_reduce, METH_NOARGS, reduce_doc},
1079-
{"__setstate__", (PyCFunction)tupleiter_setstate, METH_O, setstate_doc},
1080-
{NULL, NULL} /* sentinel */
1083+
{"__length_hint__", tupleiter_len, METH_NOARGS, length_hint_doc},
1084+
{"__reduce__", tupleiter_reduce, METH_NOARGS, reduce_doc},
1085+
{"__setstate__", tupleiter_setstate, METH_O, setstate_doc},
1086+
{NULL, NULL, 0, NULL} /* sentinel */
10811087
};
10821088

10831089
PyTypeObject PyTupleIter_Type = {
10841090
PyVarObject_HEAD_INIT(&PyType_Type, 0)
10851091
"tuple_iterator", /* tp_name */
1086-
sizeof(_PyTupleIterObject), /* tp_basicsize */
1092+
sizeof(_PyTupleIterObject), /* tp_basicsize */
10871093
0, /* tp_itemsize */
10881094
/* methods */
1089-
(destructor)tupleiter_dealloc, /* tp_dealloc */
1095+
tupleiter_dealloc, /* tp_dealloc */
10901096
0, /* tp_vectorcall_offset */
10911097
0, /* tp_getattr */
10921098
0, /* tp_setattr */
@@ -1103,7 +1109,7 @@ PyTypeObject PyTupleIter_Type = {
11031109
0, /* tp_as_buffer */
11041110
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
11051111
0, /* tp_doc */
1106-
(traverseproc)tupleiter_traverse, /* tp_traverse */
1112+
tupleiter_traverse, /* tp_traverse */
11071113
0, /* tp_clear */
11081114
0, /* tp_richcompare */
11091115
0, /* tp_weaklistoffset */

0 commit comments

Comments
 (0)