Skip to content

Commit 96a0c4e

Browse files
committed
fix UBSan failures for mapobject
1 parent 5230000 commit 96a0c4e

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

Python/bltinmodule.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,8 @@ typedef struct {
13251325
int strict;
13261326
} mapobject;
13271327

1328+
#define _mapobject_CAST(op) ((mapobject *)(op))
1329+
13281330
static PyObject *
13291331
map_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
13301332
{
@@ -1428,25 +1430,28 @@ map_vectorcall(PyObject *type, PyObject * const*args,
14281430
}
14291431

14301432
static void
1431-
map_dealloc(mapobject *lz)
1433+
map_dealloc(PyObject *self)
14321434
{
1435+
mapobject *lz = _mapobject_CAST(self);
14331436
PyObject_GC_UnTrack(lz);
14341437
Py_XDECREF(lz->iters);
14351438
Py_XDECREF(lz->func);
14361439
Py_TYPE(lz)->tp_free(lz);
14371440
}
14381441

14391442
static int
1440-
map_traverse(mapobject *lz, visitproc visit, void *arg)
1443+
map_traverse(PyObject *self, visitproc visit, void *arg)
14411444
{
1445+
mapobject *lz = _mapobject_CAST(self);
14421446
Py_VISIT(lz->iters);
14431447
Py_VISIT(lz->func);
14441448
return 0;
14451449
}
14461450

14471451
static PyObject *
1448-
map_next(mapobject *lz)
1452+
map_next(PyObject *self)
14491453
{
1454+
mapobject *lz = _mapobject_CAST(self);
14501455
Py_ssize_t i;
14511456
PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
14521457
PyObject **stack;
@@ -1529,8 +1534,9 @@ map_next(mapobject *lz)
15291534
}
15301535

15311536
static PyObject *
1532-
map_reduce(mapobject *lz, PyObject *Py_UNUSED(ignored))
1537+
map_reduce(PyObject *self, PyObject *Py_UNUSED(ignored))
15331538
{
1539+
mapobject *lz = _mapobject_CAST(self);
15341540
Py_ssize_t numargs = PyTuple_GET_SIZE(lz->iters);
15351541
PyObject *args = PyTuple_New(numargs+1);
15361542
Py_ssize_t i;
@@ -1551,19 +1557,20 @@ map_reduce(mapobject *lz, PyObject *Py_UNUSED(ignored))
15511557
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
15521558

15531559
static PyObject *
1554-
map_setstate(mapobject *lz, PyObject *state)
1560+
map_setstate(PyObject *self, PyObject *state)
15551561
{
15561562
int strict = PyObject_IsTrue(state);
15571563
if (strict < 0) {
15581564
return NULL;
15591565
}
1566+
mapobject *lz = _mapobject_CAST(self);
15601567
lz->strict = strict;
15611568
Py_RETURN_NONE;
15621569
}
15631570

15641571
static PyMethodDef map_methods[] = {
1565-
{"__reduce__", _PyCFunction_CAST(map_reduce), METH_NOARGS, reduce_doc},
1566-
{"__setstate__", _PyCFunction_CAST(map_setstate), METH_O, setstate_doc},
1572+
{"__reduce__", map_reduce, METH_NOARGS, reduce_doc},
1573+
{"__setstate__", map_setstate, METH_O, setstate_doc},
15671574
{NULL, NULL} /* sentinel */
15681575
};
15691576

@@ -1584,7 +1591,7 @@ PyTypeObject PyMap_Type = {
15841591
sizeof(mapobject), /* tp_basicsize */
15851592
0, /* tp_itemsize */
15861593
/* methods */
1587-
(destructor)map_dealloc, /* tp_dealloc */
1594+
map_dealloc, /* tp_dealloc */
15881595
0, /* tp_vectorcall_offset */
15891596
0, /* tp_getattr */
15901597
0, /* tp_setattr */
@@ -1602,12 +1609,12 @@ PyTypeObject PyMap_Type = {
16021609
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
16031610
Py_TPFLAGS_BASETYPE, /* tp_flags */
16041611
map_doc, /* tp_doc */
1605-
(traverseproc)map_traverse, /* tp_traverse */
1612+
map_traverse, /* tp_traverse */
16061613
0, /* tp_clear */
16071614
0, /* tp_richcompare */
16081615
0, /* tp_weaklistoffset */
16091616
PyObject_SelfIter, /* tp_iter */
1610-
(iternextfunc)map_next, /* tp_iternext */
1617+
map_next, /* tp_iternext */
16111618
map_methods, /* tp_methods */
16121619
0, /* tp_members */
16131620
0, /* tp_getset */
@@ -1620,7 +1627,7 @@ PyTypeObject PyMap_Type = {
16201627
PyType_GenericAlloc, /* tp_alloc */
16211628
map_new, /* tp_new */
16221629
PyObject_GC_Del, /* tp_free */
1623-
.tp_vectorcall = (vectorcallfunc)map_vectorcall
1630+
.tp_vectorcall = map_vectorcall
16241631
};
16251632

16261633

0 commit comments

Comments
 (0)