From 77e8041f17c4d235f138f1538347c4907d06b785 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, 25 Jan 2025 10:54:21 +0100 Subject: [PATCH 1/4] fix UBSan failures for `dbmobject` --- Modules/_dbmmodule.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 1be4234aad3291..88a0c85bed5de1 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -64,6 +64,8 @@ typedef struct { DBM *di_dbm; } dbmobject; +#define _dbmobject_CAST(op) ((dbmobject *)(op)) + #include "clinic/_dbmmodule.c.h" #define check_dbmobject_open(v, err) \ @@ -94,15 +96,16 @@ newdbmobject(_dbm_state *state, const char *file, int flags, int mode) /* Methods */ static int -dbm_traverse(dbmobject *dp, visitproc visit, void *arg) +dbm_traverse(PyObject *dp, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(dp)); return 0; } static void -dbm_dealloc(dbmobject *dp) +dbm_dealloc(PyObject *self) { + dbmobject *dp = _dbmobject_CAST(self); PyObject_GC_UnTrack(dp); if (dp->di_dbm) { dbm_close(dp->di_dbm); @@ -113,8 +116,9 @@ dbm_dealloc(dbmobject *dp) } static Py_ssize_t -dbm_length(dbmobject *dp) +dbm_length(PyObject *self) { + dbmobject *dp = _dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); if (dp->di_dbm == NULL) { @@ -135,8 +139,9 @@ dbm_length(dbmobject *dp) } static int -dbm_bool(dbmobject *dp) +dbm_bool(PyObject *self) { + dbmobject *dp = _dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); @@ -166,10 +171,11 @@ dbm_bool(dbmobject *dp) } static PyObject * -dbm_subscript(dbmobject *dp, PyObject *key) +dbm_subscript(PyObject *self, PyObject *key) { datum drec, krec; Py_ssize_t tmp_size; + dbmobject *dp = _dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size)) { @@ -192,10 +198,11 @@ dbm_subscript(dbmobject *dp, PyObject *key) } static int -dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w) +dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w) { datum krec, drec; Py_ssize_t tmp_size; + dbmobject *dp = _dbmobject_CAST(self); if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) { PyErr_SetString(PyExc_TypeError, @@ -305,7 +312,7 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls) static int dbm_contains(PyObject *self, PyObject *arg) { - dbmobject *dp = (dbmobject *)self; + dbmobject *dp = _dbmobject_CAST(self); datum key, val; Py_ssize_t size; @@ -452,15 +459,16 @@ _dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls) } static PyObject * -dbm__enter__(PyObject *self, PyObject *args) +dbm__enter__(PyObject *self, PyObject *Py_UNUSED(args)) { return Py_NewRef(self); } static PyObject * -dbm__exit__(PyObject *self, PyObject *args) +dbm__exit__(PyObject *self, PyObject *Py_UNUSED(args)) { - return _dbm_dbm_close_impl((dbmobject *)self); + dbmobject *dp = _dbmobject_CAST(self); + return _dbm_dbm_close_impl(dp); } static PyMethodDef dbm_methods[] = { From 354f5ad0b14371e39f33a10d31d3940a7a511126 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, 25 Jan 2025 10:54:28 +0100 Subject: [PATCH 2/4] suppress unused return values --- Modules/_dbmmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 88a0c85bed5de1..5608d7e6a4c521 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -618,7 +618,7 @@ _dbm_module_clear(PyObject *module) static void _dbm_module_free(void *module) { - _dbm_module_clear((PyObject *)module); + (void)_dbm_module_clear((PyObject *)module); } static PyModuleDef_Slot _dbmmodule_slots[] = { From 919bb26e2f5971b430d9d52e0102ac3bdb864b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Fri, 7 Feb 2025 12:05:25 +0100 Subject: [PATCH 3/4] use 'dummy' for NOARGS method --- Modules/_dbmmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 5608d7e6a4c521..d5f8ddcd5f2d5b 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -459,7 +459,7 @@ _dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls) } static PyObject * -dbm__enter__(PyObject *self, PyObject *Py_UNUSED(args)) +dbm__enter__(PyObject *self, PyObject *Py_UNUSED(dummy)) { return Py_NewRef(self); } From 2bc23804f06010e5a284a19c3bb73ba0403dd779 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, 8 Feb 2025 09:59:18 +0100 Subject: [PATCH 4/4] Do not add an underscore to the prefix if none is needed. --- Modules/_dbmmodule.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index d5f8ddcd5f2d5b..cc65cbd98d71dc 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -64,7 +64,7 @@ typedef struct { DBM *di_dbm; } dbmobject; -#define _dbmobject_CAST(op) ((dbmobject *)(op)) +#define dbmobject_CAST(op) ((dbmobject *)(op)) #include "clinic/_dbmmodule.c.h" @@ -105,7 +105,7 @@ dbm_traverse(PyObject *dp, visitproc visit, void *arg) static void dbm_dealloc(PyObject *self) { - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); PyObject_GC_UnTrack(dp); if (dp->di_dbm) { dbm_close(dp->di_dbm); @@ -118,7 +118,7 @@ dbm_dealloc(PyObject *self) static Py_ssize_t dbm_length(PyObject *self) { - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); if (dp->di_dbm == NULL) { @@ -141,7 +141,7 @@ dbm_length(PyObject *self) static int dbm_bool(PyObject *self) { - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); @@ -175,7 +175,7 @@ dbm_subscript(PyObject *self, PyObject *key) { datum drec, krec; Py_ssize_t tmp_size; - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); _dbm_state *state = PyType_GetModuleState(Py_TYPE(dp)); assert(state != NULL); if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size)) { @@ -202,7 +202,7 @@ dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w) { datum krec, drec; Py_ssize_t tmp_size; - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) { PyErr_SetString(PyExc_TypeError, @@ -312,7 +312,7 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls) static int dbm_contains(PyObject *self, PyObject *arg) { - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); datum key, val; Py_ssize_t size; @@ -467,7 +467,7 @@ dbm__enter__(PyObject *self, PyObject *Py_UNUSED(dummy)) static PyObject * dbm__exit__(PyObject *self, PyObject *Py_UNUSED(args)) { - dbmobject *dp = _dbmobject_CAST(self); + dbmobject *dp = dbmobject_CAST(self); return _dbm_dbm_close_impl(dp); }