gh-111178: fix UBSan failures for PyBufferWrapper (#131616)

This commit is contained in:
Bénédikt Tran 2025-03-24 10:52:52 +01:00 committed by GitHub
parent 82e541bf91
commit aa444bc4af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -10372,9 +10372,12 @@ typedef struct _PyBufferWrapper {
PyObject *obj; PyObject *obj;
} PyBufferWrapper; } PyBufferWrapper;
#define PyBufferWrapper_CAST(op) ((PyBufferWrapper *)(op))
static int static int
bufferwrapper_traverse(PyBufferWrapper *self, visitproc visit, void *arg) bufferwrapper_traverse(PyObject *op, visitproc visit, void *arg)
{ {
PyBufferWrapper *self = PyBufferWrapper_CAST(op);
Py_VISIT(self->mv); Py_VISIT(self->mv);
Py_VISIT(self->obj); Py_VISIT(self->obj);
return 0; return 0;
@ -10383,7 +10386,7 @@ bufferwrapper_traverse(PyBufferWrapper *self, visitproc visit, void *arg)
static void static void
bufferwrapper_dealloc(PyObject *self) bufferwrapper_dealloc(PyObject *self)
{ {
PyBufferWrapper *bw = (PyBufferWrapper *)self; PyBufferWrapper *bw = PyBufferWrapper_CAST(self);
_PyObject_GC_UNTRACK(self); _PyObject_GC_UNTRACK(self);
Py_XDECREF(bw->mv); Py_XDECREF(bw->mv);
@ -10394,7 +10397,7 @@ bufferwrapper_dealloc(PyObject *self)
static void static void
bufferwrapper_releasebuf(PyObject *self, Py_buffer *view) bufferwrapper_releasebuf(PyObject *self, Py_buffer *view)
{ {
PyBufferWrapper *bw = (PyBufferWrapper *)self; PyBufferWrapper *bw = PyBufferWrapper_CAST(self);
if (bw->mv == NULL || bw->obj == NULL) { if (bw->mv == NULL || bw->obj == NULL) {
// Already released // Already released
@ -10429,7 +10432,7 @@ PyTypeObject _PyBufferWrapper_Type = {
.tp_basicsize = sizeof(PyBufferWrapper), .tp_basicsize = sizeof(PyBufferWrapper),
.tp_alloc = PyType_GenericAlloc, .tp_alloc = PyType_GenericAlloc,
.tp_free = PyObject_GC_Del, .tp_free = PyObject_GC_Del,
.tp_traverse = (traverseproc)bufferwrapper_traverse, .tp_traverse = bufferwrapper_traverse,
.tp_dealloc = bufferwrapper_dealloc, .tp_dealloc = bufferwrapper_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
.tp_as_buffer = &bufferwrapper_as_buffer, .tp_as_buffer = &bufferwrapper_as_buffer,