8000 fix UBSan failures for `unpackiterobject` · python/cpython@69feffd · GitHub
[go: up one dir, main page]

Skip to content

Commit 69feffd

Browse files
committed
fix UBSan failures for unpackiterobject
1 parent 5613079 commit 69feffd

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

Modules/_struct.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2030,9 +2030,12 @@ typedef struct {
20302030
Py_ssize_t index;
20312031
} unpackiterobject;
20322032

2033+
#define _unpackiterobject_CAST(op) ((unpackiterobject *)(op))
2034+
20332035
static void
2034-
unpackiter_dealloc(unpackiterobject *self)
2036+
unpackiter_dealloc(PyObject *op)
20352037
{
2038+
unpackiterobject *self = _unpackiterobject_CAST(op);
20362039
/* bpo-31095: UnTrack is needed before calling any callbacks */
20372040
PyTypeObject *tp = Py_TYPE(self);
20382041
PyObject_GC_UnTrack(self);
@@ -2043,37 +2046,43 @@ unpackiter_dealloc(unpackiterobject *self)
20432046
}
20442047

20452048
static int
2046-
unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg)
2049+
unpackiter_traverse(PyObject *op, visitproc visit, void *arg)
20472050
{
2051+
unpackiterobject *self = _unpackiterobject_CAST(op);
20482052
Py_VISIT(Py_TYPE(self));
20492053
Py_VISIT(self->so);
20502054
Py_VISIT(self->buf.obj);
20512055
return 0;
20522056
}
20532057

20542058
static PyObject *
2055-
unpackiter_len(unpackiterobject *self, PyObject *Py_UNUSED(ignored))
2059+
unpackiter_len(PyObject *op, PyObject *Py_UNUSED(args))
20562060
{
20572061
Py_ssize_t len;
2058-
if (self->so == NULL)
2062+
unpackiterobject *self = _unpackiterobject_CAST(op);
2063+
if (self->so == NULL) {
20592064
len = 0;
2060-
else
2065+
}
2066+
else {
20612067
len = (self->buf.len - self->index) / self->so->s_size;
2068+
}
20622069
return PyLong_FromSsize_t(len);
20632070
}
20642071

20652072
static PyMethodDef unpackiter_methods[] = {
2066-
{"__length_hint__", (PyCFunction) unpackiter_len, METH_NOARGS, NULL},
2073+
{"__length_hint__", unpackiter_len, METH_NOARGS, NULL},
20672074
{NULL, NULL} /* sentinel */
20682075
};
20692076

20702077
static PyObject *
2071-
unpackiter_iternext(unpackiterobject *self)
2078+
unpackiter_iternext(PyObject *op)
20722079
{
2080+
unpackiterobject *self = _unpackiterobject_CAST(op);
20732081
_structmodulestate *state = get_struct_state_iterinst(self);
20742082
PyObject *result;
2075-
if (self->so == NULL)
2083+
if (self->so == NULL) {
20762084
return NULL;
2085+
}
20772086
if (self->index >= self->buf.len) {
20782087
/* Iterator exhausted */
20792088
Py_CLEAR(self->so);
@@ -2082,7 +2091,7 @@ unpackiter_iternext(unpackiterobject *self)
20822091
}
20832092
assert(self->index + self->so->s_size <= self->buf.len);
20842093
result = s_unpack_internal(self->so,
2085-
(char*) self->buf.buf + self->index,
2094+
(char *)self->buf.buf + self->index,
20862095
state);
20872096
self->index += self->so->s_size;
20882097
return result;

0 commit comments

Comments
 (0)
0