Skip to content

Commit 491b814

Browse files
authored
gh-111178: fix UBSan failures for Modules/_testcapi/{buffer,monitoring}.c (#131613)
1 parent a1205ef commit 491b814

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

Modules/_testcapi/buffer.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ typedef struct {
1111
Py_ssize_t references;
1212
} testBufObject;
1313

14+
#define testBufObject_CAST(op) ((testBufObject *)(op))
15+
1416
static PyObject *
1517
testbuf_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1618
{
@@ -29,30 +31,34 @@ testbuf_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2931
}
3032

3133
static int
32-
testbuf_traverse(testBufObject *self, visitproc visit, void *arg)
34+
testbuf_traverse(PyObject *op, visitproc visit, void *arg)
3335
{
36+
testBufObject *self = testBufObject_CAST(op);
3437
Py_VISIT(self->obj);
3538
return 0;
3639
}
3740

3841
static int
39-
testbuf_clear(testBufObject *self)
42+
testbuf_clear(PyObject *op)
4043
{
44+
testBufObject *self = testBufObject_CAST(op);
4145
Py_CLEAR(self->obj);
4246
return 0;
4347
}
4448

4549
static void
46-
testbuf_dealloc(testBufObject *self)
50+
testbuf_dealloc(PyObject *op)
4751
{
52+
testBufObject *self = testBufObject_CAST(op);
4853
PyObject_GC_UnTrack(self);
4954
Py_XDECREF(self->obj);
50-
Py_TYPE(self)->tp_free((PyObject *) self);
55+
Py_TYPE(self)->tp_free(self);
5156
}
5257

5358
static int
54-
testbuf_getbuf(testBufObject *self, Py_buffer *view, int flags)
59+
testbuf_getbuf(PyObject *op, Py_buffer *view, int flags)
5560
{
61+
testBufObject *self = testBufObject_CAST(op);
5662
int buf = PyObject_GetBuffer(self->obj, view, flags);
5763
if (buf == 0) {
5864
Py_SETREF(view->obj, Py_NewRef(self));
@@ -62,15 +68,16 @@ testbuf_getbuf(testBufObject *self, Py_buffer *view, int flags)
6268
}
6369

6470
static void
65-
testbuf_releasebuf(testBufObject *self, Py_buffer *view)
71+
testbuf_releasebuf(PyObject *op, Py_buffer *Py_UNUSED(view))
6672
{
73+
testBufObject *self = testBufObject_CAST(op);
6774
self->references--;
6875
assert(self->references >= 0);
6976
}
7077

7178
static PyBufferProcs testbuf_as_buffer = {
72-
.bf_getbuffer = (getbufferproc) testbuf_getbuf,
73-
.bf_releasebuffer = (releasebufferproc) testbuf_releasebuf,
79+
.bf_getbuffer = testbuf_getbuf,
80+
.bf_releasebuffer = testbuf_releasebuf,
7481
};
7582

7683
static struct PyMemberDef testbuf_members[] = {
@@ -84,9 +91,9 @@ static PyTypeObject testBufType = {
8491
.tp_basicsize = sizeof(testBufObject),
8592
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
8693
.tp_new = testbuf_new,
87-
.tp_dealloc = (destructor) testbuf_dealloc,
88-
.tp_traverse = (traverseproc) testbuf_traverse,
89-
.tp_clear = (inquiry) testbuf_clear,
94+
.tp_dealloc = testbuf_dealloc,
95+
.tp_traverse = testbuf_traverse,
96+
.tp_clear = testbuf_clear,
9097
.tp_as_buffer = &testbuf_as_buffer,
9198
.tp_members = testbuf_members
9299
};

Modules/_testcapi/monitoring.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ typedef struct {
1414
/* Other fields */
1515
} PyCodeLikeObject;
1616

17+
#define PyCodeLikeObject_CAST(op) ((PyCodeLikeObject *)(op))
1718

1819
static PyObject *
1920
CodeLike_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@@ -40,17 +41,19 @@ CodeLike_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4041
}
4142

4243
static void
43-
CodeLike_dealloc(PyCodeLikeObject *self)
44+
CodeLike_dealloc(PyObject *op)
4445
{
46+
PyCodeLikeObject *self = PyCodeLikeObject_CAST(op);
4547
if (self->monitoring_states) {
4648
PyMem_Free(self->monitoring_states);
4749
}
4850
Py_TYPE(self)->tp_free((PyObject *) self);
4951
}
5052

5153
static PyObject *
52-
CodeLike_str(PyCodeLikeObject *self)
54+
CodeLike_str(PyObject *op)
5355
{
56+
PyCodeLikeObject *self = PyCodeLikeObject_CAST(op);
5457
PyObject *res = NULL;
5558
PyObject *sep = NULL;
5659
PyObject *parts = NULL;
@@ -101,8 +104,8 @@ static PyTypeObject PyCodeLike_Type = {
101104
.tp_itemsize = 0,
102105
.tp_flags = Py_TPFLAGS_DEFAULT,
103106
.tp_new = CodeLike_new,
104-
.tp_dealloc = (destructor) CodeLike_dealloc,
105-
.tp_str = (reprfunc) CodeLike_str,
107+
.tp_dealloc = CodeLike_dealloc,
108+
.tp_str = CodeLike_str,
106109
};
107110

108111
#define RAISE_UNLESS_CODELIKE(v) if (!Py_IS_TYPE((v), &PyCodeLike_Type)) { \

0 commit comments

Comments
 (0)