Skip to content

Commit 845d924

Browse files
authored
gh-111178: fix UBSan failures in Objects/capsule.c (GH-128239)
fix UBSan failures for `PyCapsule`
1 parent 1da0901 commit 845d924

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

Objects/capsule.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ typedef struct {
1818
} PyCapsule;
1919

2020

21+
#define _PyCapsule_CAST(op) ((PyCapsule *)(op))
22+
2123

2224
static int
2325
_is_legal_capsule(PyObject *op, const char *invalid_capsule)
@@ -284,7 +286,7 @@ PyCapsule_Import(const char *name, int no_block)
284286
static void
285287
capsule_dealloc(PyObject *op)
286288
{
287-
PyCapsule *capsule = (PyCapsule *)op;
289+
PyCapsule *capsule = _PyCapsule_CAST(op);
288290
PyObject_GC_UnTrack(op);
289291
if (capsule->destructor) {
290292
capsule->destructor(op);
@@ -296,7 +298,7 @@ capsule_dealloc(PyObject *op)
296298
static PyObject *
297299
capsule_repr(PyObject *o)
298300
{
299-
PyCapsule *capsule = (PyCapsule *)o;
301+
PyCapsule *capsule = _PyCapsule_CAST(o);
300302
const char *name;
301303
const char *quote;
302304

@@ -314,28 +316,27 @@ capsule_repr(PyObject *o)
314316

315317

316318
static int
317-
capsule_traverse(PyCapsule *capsule, visitproc visit, void *arg)
319+
capsule_traverse(PyObject *self, visitproc visit, void *arg)
318320
{
319321
// Capsule object is only tracked by the GC
320322
// if _PyCapsule_SetTraverse() is called, but
321323
// this can still be manually triggered by gc.get_referents()
322-
324+
PyCapsule *capsule = _PyCapsule_CAST(self);
323325
if (capsule->traverse_func != NULL) {
324-
return capsule->traverse_func((PyObject*)capsule, visit, arg);
326+
return capsule->traverse_func(self, visit, arg);
325327
}
326-
327328
return 0;
328329
}
329330

330331

331332
static int
332-
capsule_clear(PyCapsule *capsule)
333+
capsule_clear(PyObject *self)
333334
{
334335
// Capsule object is only tracked by the GC
335336
// if _PyCapsule_SetTraverse() is called
337+
PyCapsule *capsule = _PyCapsule_CAST(self);
336338
assert(capsule->clear_func != NULL);
337-
338-
return capsule->clear_func((PyObject*)capsule);
339+
return capsule->clear_func(self);
339340
}
340341

341342

@@ -358,8 +359,8 @@ PyTypeObject PyCapsule_Type = {
358359
.tp_dealloc = capsule_dealloc,
359360
.tp_repr = capsule_repr,
360361
.tp_doc = PyCapsule_Type__doc__,
361-
.tp_traverse = (traverseproc)capsule_traverse,
362-
.tp_clear = (inquiry)capsule_clear,
362+
.tp_traverse = capsule_traverse,
363+
.tp_clear = capsule_clear,
363364
};
364365

365366

0 commit comments

Comments
 (0)