Skip to content

Commit 951fcdc

Browse files
committed
fix UBSan failures for calliterobject
1 parent f7ee5c2 commit 951fcdc

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

Objects/iterobject.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ typedef struct {
187187
PyObject *it_sentinel; /* Set to NULL when iterator is exhausted */
188188
} calliterobject;
189189

190+
#define calliterobject_CAST(op) ((calliterobject *)(op))
191+
190192
PyObject *
191193
PyCallIter_New(PyObject *callable, PyObject *sentinel)
192194
{
@@ -202,16 +204,17 @@ PyCallIter_New(PyObject *callable, PyObject *sentinel)
202204
static void
203205
calliter_dealloc(PyObject *op)
204206
{
205-
calliterobject *it = (calliterobject*)op;
207+
calliterobject *it = calliterobject_CAST(op);
206208
_PyObject_GC_UNTRACK(it);
207209
Py_XDECREF(it->it_callable);
208210
Py_XDECREF(it->it_sentinel);
209211
PyObject_GC_Del(it);
210212
}
211213

212214
static int
213-
calliter_traverse(calliterobject *it, visitproc visit, void *arg)
215+
calliter_traverse(PyObject *op, visitproc visit, void *arg)
214216
{
217+
calliterobject *it = calliterobject_CAST(op);
215218
Py_VISIT(it->it_callable);
216219
Py_VISIT(it->it_sentinel);
217220
return 0;
@@ -220,7 +223,7 @@ calliter_traverse(calliterobject *it, visitproc visit, void *arg)
220223
static PyObject *
221224
calliter_iternext(PyObject *op)
222225
{
223-
calliterobject *it = (calliterobject*)op;
226+
calliterobject *it = calliterobject_CAST(op);
224227
PyObject *result;
225228

226229
if (it->it_callable == NULL) {
@@ -253,7 +256,7 @@ calliter_iternext(PyObject *op)
253256
static PyObject *
254257
calliter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
255258
{
256-
calliterobject *it = (calliterobject*)op;
259+
calliterobject *it = calliterobject_CAST(op);
257260
PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
258261

259262
/* _PyEval_GetBuiltin can invoke arbitrary code,
@@ -294,7 +297,7 @@ PyTypeObject PyCallIter_Type = {
294297
0, /* tp_as_buffer */
295298
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
296299
0, /* tp_doc */
297-
(traverseproc)calliter_traverse, /* tp_traverse */
300+
calliter_traverse, /* tp_traverse */
298301
0, /* tp_clear */
299302
0, /* tp_richcompare */
300303
0, /* tp_weaklistoffset */

0 commit comments

Comments
 (0)