Skip to content

Commit a1a6df2

Browse files
authored
gh-111178: fix UBSan failures in Modules/_dbmmodule.c (#129775)
This fixes UBSan failures for `dbmobject`. In addition, we perform some minor cleanup changes such as renaming some `args` parameter to `dummy` in some `METH_NOARGS` methods and suppressing an unused return value in `_dbm_module_free`.
1 parent 978211c commit a1a6df2

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

Modules/_dbmmodule.c

+19-11
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ typedef struct {
6464
DBM *di_dbm;
6565
} dbmobject;
6666

67+
#define dbmobject_CAST(op) ((dbmobject *)(op))
68+
6769
#include "clinic/_dbmmodule.c.h"
6870

6971
#define check_dbmobject_open(v, err) \
@@ -94,15 +96,16 @@ newdbmobject(_dbm_state *state, const char *file, int flags, int mode)
9496

9597
/* Methods */
9698
static int
97-
dbm_traverse(dbmobject *dp, visitproc visit, void *arg)
99+
dbm_traverse(PyObject *dp, visitproc visit, void *arg)
98100
{
99101
Py_VISIT(Py_TYPE(dp));
100102
return 0;
101103
}
102104

103105
static void
104-
dbm_dealloc(dbmobject *dp)
106+
dbm_dealloc(PyObject *self)
105107
{
108+
dbmobject *dp = dbmobject_CAST(self);
106109
PyObject_GC_UnTrack(dp);
107110
if (dp->di_dbm) {
108111
dbm_close(dp->di_dbm);
@@ -113,8 +116,9 @@ dbm_dealloc(dbmobject *dp)
113116
}
114117

115118
static Py_ssize_t
116-
dbm_length(dbmobject *dp)
119+
dbm_length(PyObject *self)
117120
{
121+
dbmobject *dp = dbmobject_CAST(self);
118122
_dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
119123
assert(state != NULL);
120124
if (dp->di_dbm == NULL) {
@@ -135,8 +139,9 @@ dbm_length(dbmobject *dp)
135139
}
136140

137141
static int
138-
dbm_bool(dbmobject *dp)
142+
dbm_bool(PyObject *self)
139143
{
144+
dbmobject *dp = dbmobject_CAST(self);
140145
_dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
141146
assert(state != NULL);
142147

@@ -166,10 +171,11 @@ dbm_bool(dbmobject *dp)
166171
}
167172

168173
static PyObject *
169-
dbm_subscript(dbmobject *dp, PyObject *key)
174+
dbm_subscript(PyObject *self, PyObject *key)
170175
{
171176
datum drec, krec;
172177
Py_ssize_t tmp_size;
178+
dbmobject *dp = dbmobject_CAST(self);
173179
_dbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
174180
assert(state != NULL);
175181
if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size)) {
@@ -192,10 +198,11 @@ dbm_subscript(dbmobject *dp, PyObject *key)
192198
}
193199

194200
static int
195-
dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
201+
dbm_ass_sub(PyObject *self, PyObject *v, PyObject *w)
196202
{
197203
datum krec, drec;
198204
Py_ssize_t tmp_size;
205+
dbmobject *dp = dbmobject_CAST(self);
199206

200207
if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
201208
PyErr_SetString(PyExc_TypeError,
@@ -305,7 +312,7 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls)
305312
static int
306313
dbm_contains(PyObject *self, PyObject *arg)
307314
{
308-
dbmobject *dp = (dbmobject *)self;
315+
dbmobject *dp = dbmobject_CAST(self);
309316
datum key, val;
310317
Py_ssize_t size;
311318

@@ -452,15 +459,16 @@ _dbm_dbm_clear_impl(dbmobject *self, PyTypeObject *cls)
452459
}
453460

454461
static PyObject *
455-
dbm__enter__(PyObject *self, PyObject *args)
462+
dbm__enter__(PyObject *self, PyObject *Py_UNUSED(dummy))
456463
{
457464
return Py_NewRef(self);
458465
}
459466

460467
static PyObject *
461-
dbm__exit__(PyObject *self, PyObject *args)
468+
dbm__exit__(PyObject *self, PyObject *Py_UNUSED(args))
462469
{
463-
return _dbm_dbm_close_impl((dbmobject *)self);
470+
dbmobject *dp = dbmobject_CAST(self);
471+
return _dbm_dbm_close_impl(dp);
464472
}
465473

466474
static PyMethodDef dbm_methods[] = {
@@ -610,7 +618,7 @@ _dbm_module_clear(PyObject *module)
610618
static void
611619
_dbm_module_free(void *module)
612620
{
613-
_dbm_module_clear((PyObject *)module);
621+
(void)_dbm_module_clear((PyObject *)module);
614622
}
615623

616624
static PyModuleDef_Slot _dbmmodule_slots[] = {

0 commit comments

Comments
 (0)