Skip to content

Commit

Permalink
gh-111178: fix UBSan failures in Objects/capsule.c (GH-128239)
Browse files Browse the repository at this point in the history
fix UBSan failures for `PyCapsule`
  • Loading branch information
picnixz authored Jan 8, 2025
1 parent 1da0901 commit 845d924
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions Objects/capsule.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ typedef struct {
} PyCapsule;


#define _PyCapsule_CAST(op) ((PyCapsule *)(op))


static int
_is_legal_capsule(PyObject *op, const char *invalid_capsule)
Expand Down Expand Up @@ -284,7 +286,7 @@ PyCapsule_Import(const char *name, int no_block)
static void
capsule_dealloc(PyObject *op)
{
PyCapsule *capsule = (PyCapsule *)op;
PyCapsule *capsule = _PyCapsule_CAST(op);
PyObject_GC_UnTrack(op);
if (capsule->destructor) {
capsule->destructor(op);
Expand All @@ -296,7 +298,7 @@ capsule_dealloc(PyObject *op)
static PyObject *
capsule_repr(PyObject *o)
{
PyCapsule *capsule = (PyCapsule *)o;
PyCapsule *capsule = _PyCapsule_CAST(o);
const char *name;
const char *quote;

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


static int
capsule_traverse(PyCapsule *capsule, visitproc visit, void *arg)
capsule_traverse(PyObject *self, visitproc visit, void *arg)
{
// Capsule object is only tracked by the GC
// if _PyCapsule_SetTraverse() is called, but
// this can still be manually triggered by gc.get_referents()

PyCapsule *capsule = _PyCapsule_CAST(self);
if (capsule->traverse_func != NULL) {
return capsule->traverse_func((PyObject*)capsule, visit, arg);
return capsule->traverse_func(self, visit, arg);
}

return 0;
}


static int
capsule_clear(PyCapsule *capsule)
capsule_clear(PyObject *self)
{
// Capsule object is only tracked by the GC
// if _PyCapsule_SetTraverse() is called
PyCapsule *capsule = _PyCapsule_CAST(self);
assert(capsule->clear_func != NULL);

return capsule->clear_func((PyObject*)capsule);
return capsule->clear_func(self);
}


Expand All @@ -358,8 +359,8 @@ PyTypeObject PyCapsule_Type = {
.tp_dealloc = capsule_dealloc,
.tp_repr = capsule_repr,
.tp_doc = PyCapsule_Type__doc__,
.tp_traverse = (traverseproc)capsule_traverse,
.tp_clear = (inquiry)capsule_clear,
.tp_traverse = capsule_traverse,
.tp_clear = capsule_clear,
};


0 comments on commit 845d924

Please sign in to comment.