https://github.com/python/cpython/commit/de13293d264f1cec439d87fc477d0ccf05793a1a
commit: de13293d264f1cec439d87fc477d0ccf05793a1a
branch: main
author: Bénédikt Tran <10796600+picn...@users.noreply.github.com>
committer: encukou <encu...@gmail.com>
date: 2025-02-24T13:20:49+01:00
summary:

gh-111178: fix UBSan failures in `Modules/posixmodule.c` (GH-129788)

Fix UBSan failures for `DirEntry`, `ScandirIterator`
Use better semantic naming

files:
M Modules/posixmodule.c

diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 6dfe73017abf9d..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__);
@@ -15584,9 +15584,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);
@@ -15915,8 +15918,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("<DirEntry %R>", self->name);
 }
 
@@ -16179,6 +16183,8 @@ typedef struct {
 #endif
 } ScandirIterator;
 
+#define ScandirIterator_CAST(op)    ((ScandirIterator *)(op))
+
 #ifdef MS_WINDOWS
 
 static int
@@ -16202,8 +16208,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;
@@ -16273,8 +16280,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;
@@ -16326,37 +16334,40 @@ ScandirIterator_iternext(ScandirIterator *iterator)
 #endif
 
 static PyObject *
-ScandirIterator_close(ScandirIterator *self, PyObject *args)
+ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(dummy))
 {
+    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(dummy))
 {
     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_FormatUnraisable("Exception ignored while finalizing "
@@ -16372,21 +16383,21 @@ ScandirIterator_finalize(ScandirIterator *iterator)
 }
 
 static void
-ScandirIterator_dealloc(ScandirIterator *iterator)
+ScandirIterator_dealloc(PyObject *op)
 {
-    PyTypeObject *tp = Py_TYPE(iterator);
-    if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0)
+    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);
 }
 
 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}
 };
 

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to