From f53e72ac5e38fb3eb70b47a123194bef03d3ef6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:32:45 +0100 Subject: [PATCH 1/6] fix UBSan failures for `DirEntry` --- Modules/posixmodule.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index fb9e55a57703fc..af809adf28846e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -15523,9 +15523,12 @@ typedef struct { #endif } DirEntry; +#define DirEntry_CAST(op) ((DirEntry *)(op)) + static void -DirEntry_dealloc(DirEntry *entry) +DirEntry_dealloc(PyObject *op) { + DirEntry *entry = DirEntry_CAST(op); PyTypeObject *tp = Py_TYPE(entry); Py_XDECREF(entry->name); Py_XDECREF(entry->path); @@ -15854,8 +15857,9 @@ os_DirEntry_inode_impl(DirEntry *self) } static PyObject * -DirEntry_repr(DirEntry *self) +DirEntry_repr(PyObject *op) { + DirEntry *self = DirEntry_CAST(op); return PyUnicode_FromFormat("", self->name); } From b09c08bba9b5fee0d0092fa18520e9c4d41b8fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:35:23 +0100 Subject: [PATCH 2/6] fix UBSan failures for `ScandirIterator` --- Modules/posixmodule.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index af809adf28846e..4741b9ab2307a5 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -16122,6 +16122,8 @@ typedef struct { #endif } ScandirIterator; +#define ScandirIterator_CAST(op) ((ScandirIterator *)(op)) + #ifdef MS_WINDOWS static int @@ -16145,8 +16147,9 @@ ScandirIterator_closedir(ScandirIterator *iterator) } static PyObject * -ScandirIterator_iternext(ScandirIterator *iterator) +ScandirIterator_iternext(PyObject *op) { + ScandirIterator *iterator = ScandirIterator_CAST(op); WIN32_FIND_DATAW *file_data = &iterator->file_data; BOOL success; PyObject *entry; @@ -16216,8 +16219,9 @@ ScandirIterator_closedir(ScandirIterator *iterator) } static PyObject * -ScandirIterator_iternext(ScandirIterator *iterator) +ScandirIterator_iternext(PyObject *op) { + ScandirIterator *iterator = ScandirIterator_CAST(op); struct dirent *direntp; Py_ssize_t name_len; int is_dot; @@ -16269,40 +16273,43 @@ ScandirIterator_iternext(ScandirIterator *iterator) #endif static PyObject * -ScandirIterator_close(ScandirIterator *self, PyObject *args) +ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(args)) { + ScandirIterator *self = ScandirIterator_CAST(op); ScandirIterator_closedir(self); Py_RETURN_NONE; } static PyObject * -ScandirIterator_enter(PyObject *self, PyObject *args) +ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(args)) { return Py_NewRef(self); } static PyObject * -ScandirIterator_exit(ScandirIterator *self, PyObject *args) +ScandirIterator_exit(PyObject *op, PyObject *Py_UNUSED(args)) { + ScandirIterator *self = ScandirIterator_CAST(op); ScandirIterator_closedir(self); Py_RETURN_NONE; } static void -ScandirIterator_finalize(ScandirIterator *iterator) +ScandirIterator_finalize(PyObject *op) { - + ScandirIterator *iterator = ScandirIterator_CAST(op); /* Save the current exception, if any. */ PyObject *exc = PyErr_GetRaisedException(); if (!ScandirIterator_is_closed(iterator)) { ScandirIterator_closedir(iterator); - if (PyErr_ResourceWarning((PyObject *)iterator, 1, - "unclosed scandir iterator %R", iterator)) { + if (PyErr_ResourceWarning(op, 1, + "unclosed scandir iterator %R", iterator)) + { /* Spurious errors can appear at shutdown */ if (PyErr_ExceptionMatches(PyExc_Warning)) { - PyErr_WriteUnraisable((PyObject *) iterator); + PyErr_WriteUnraisable(op); } } } @@ -16314,10 +16321,11 @@ ScandirIterator_finalize(ScandirIterator *iterator) } static void -ScandirIterator_dealloc(ScandirIterator *iterator) +ScandirIterator_dealloc(PyObject *op) { + ScandirIterator *iterator = ScandirIterator_CAST(op); PyTypeObject *tp = Py_TYPE(iterator); - if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0) + if (PyObject_CallFinalizerFromDealloc(op) < 0) return; freefunc free_func = PyType_GetSlot(tp, Py_tp_free); @@ -16326,9 +16334,9 @@ ScandirIterator_dealloc(ScandirIterator *iterator) } static PyMethodDef ScandirIterator_methods[] = { - {"__enter__", (PyCFunction)ScandirIterator_enter, METH_NOARGS}, - {"__exit__", (PyCFunction)ScandirIterator_exit, METH_VARARGS}, - {"close", (PyCFunction)ScandirIterator_close, METH_NOARGS}, + {"__enter__", ScandirIterator_enter, METH_NOARGS}, + {"__exit__", ScandirIterator_exit, METH_VARARGS}, + {"close", ScandirIterator_close, METH_NOARGS}, {NULL} }; From fae1434972e0de09fca3b62868626fda89cdcc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 6 Feb 2025 15:11:16 +0100 Subject: [PATCH 3/6] use 'ignored' for NOARGS method and 'args' for others --- Modules/posixmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4741b9ab2307a5..60d5056bc152c8 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -16273,7 +16273,7 @@ ScandirIterator_iternext(PyObject *op) #endif static PyObject * -ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(args)) +ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(ignored)) { ScandirIterator *self = ScandirIterator_CAST(op); ScandirIterator_closedir(self); @@ -16281,7 +16281,7 @@ ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(args)) } static PyObject * -ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(args)) +ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(ignored)) { return Py_NewRef(self); } From d6e91482357997aa06aa47d0ec5a30196018ef2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 22 Feb 2025 10:46:35 +0100 Subject: [PATCH 4/6] address Petr's review --- Modules/posixmodule.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 80b9b78b90a11c..bb93fb7c6c1c69 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -16385,13 +16385,12 @@ ScandirIterator_finalize(PyObject *op) static void ScandirIterator_dealloc(PyObject *op) { - ScandirIterator *iterator = ScandirIterator_CAST(op); - PyTypeObject *tp = Py_TYPE(iterator); + PyTypeObject *tp = Py_TYPE(op); if (PyObject_CallFinalizerFromDealloc(op) < 0) return; freefunc free_func = PyType_GetSlot(tp, Py_tp_free); - free_func(iterator); + free_func(op); Py_DECREF(tp); } From fe5a983e9ef0d6077889d7732fdabb706693a905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 22 Feb 2025 10:47:21 +0100 Subject: [PATCH 5/6] use better semantic namgin --- Modules/posixmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index bb93fb7c6c1c69..80e2743eae8307 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -16334,7 +16334,7 @@ ScandirIterator_iternext(PyObject *op) #endif static PyObject * -ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(ignored)) +ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(dummy)) { ScandirIterator *self = ScandirIterator_CAST(op); ScandirIterator_closedir(self); @@ -16342,7 +16342,7 @@ ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(ignored)) } static PyObject * -ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(ignored)) +ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(dummy)) { return Py_NewRef(self); } From 84aef2975cd39db2db3bb0e6c6a583ad08c95b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 22 Feb 2025 10:47:54 +0100 Subject: [PATCH 6/6] remove redundant cast --- Modules/posixmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 80e2743eae8307..bf8ad19416304f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8256,13 +8256,13 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) } static PyObject * -os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(dummy)) { return Py_BuildValue("(O(N))", Py_TYPE(self), PyStructSequence_GetItem(self, 0)); } static PyMethodDef os_sched_param_reduce_method = { - "__reduce__", (PyCFunction)os_sched_param_reduce, METH_NOARGS|METH_COEXIST, NULL, + "__reduce__", os_sched_param_reduce, METH_NOARGS | METH_COEXIST, NULL, }; PyDoc_VAR(os_sched_param__doc__);