Skip to content

Commit baf6571

Browse files
authored
gh-111178: fix UBSan failures for gdbmobject (GH-128178)
* fix UBSan failures for `gdbmobject` * suppress unused return values
1 parent 28ffdc5 commit baf6571

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

Modules/_gdbmmodule.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ typedef struct {
7676
GDBM_FILE di_dbm;
7777
} gdbmobject;
7878

79+
#define _gdbmobject_CAST(op) ((gdbmobject *)(op))
80+
7981
#include "clinic/_gdbmmodule.c.h"
8082

8183
#define check_gdbmobject_open(v, err) \
@@ -120,27 +122,29 @@ newgdbmobject(_gdbm_state *state, const char *file, int flags, int mode)
120122

121123
/* Methods */
122124
static int
123-
gdbm_traverse(gdbmobject *dp, visitproc visit, void *arg)
125+
gdbm_traverse(PyObject *op, visitproc visit, void *arg)
124126
{
125-
Py_VISIT(Py_TYPE(dp));
127+
Py_VISIT(Py_TYPE(op));
126128
return 0;
127129
}
128130

129131
static void
130-
gdbm_dealloc(gdbmobject *dp)
132+
gdbm_dealloc(PyObject *op)
131133
{
134+
gdbmobject *dp = _gdbmobject_CAST(op);
135+
PyTypeObject *tp = Py_TYPE(dp);
132136
PyObject_GC_UnTrack(dp);
133137
if (dp->di_dbm) {
134138
gdbm_close(dp->di_dbm);
135139
}
136-
PyTypeObject *tp = Py_TYPE(dp);
137140
tp->tp_free(dp);
138141
Py_DECREF(tp);
139142
}
140143

141144
static Py_ssize_t
142-
gdbm_length(gdbmobject *dp)
145+
gdbm_length(PyObject *op)
143146
{
147+
gdbmobject *dp = _gdbmobject_CAST(op);
144148
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
145149
if (dp->di_dbm == NULL) {
146150
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
@@ -185,8 +189,9 @@ gdbm_length(gdbmobject *dp)
185189
}
186190

187191
static int
188-
gdbm_bool(gdbmobject *dp)
192+
gdbm_bool(PyObject *op)
189193
{
194+
gdbmobject *dp = _gdbmobject_CAST(op);
190195
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
191196
if (dp->di_dbm == NULL) {
192197
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
@@ -235,10 +240,11 @@ parse_datum(PyObject *o, datum *d, const char *failmsg)
235240
}
236241

237242
static PyObject *
238-
gdbm_subscript(gdbmobject *dp, PyObject *key)
243+
gdbm_subscript(PyObject *op, PyObject *key)
239244
{
240245
PyObject *v;
241246
datum drec, krec;
247+
gdbmobject *dp = _gdbmobject_CAST(op);
242248
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
243249

244250
if (!parse_datum(key, &krec, NULL)) {
@@ -275,7 +281,7 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
275281
{
276282
PyObject *res;
277283

278-
res = gdbm_subscript(self, key);
284+
res = gdbm_subscript((PyObject *)self, key);
279285
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
280286
PyErr_Clear();
281287
return Py_NewRef(default_value);
@@ -284,10 +290,11 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
284290
}
285291

286292
static int
287-
gdbm_ass_sub(gdbmobject *dp, PyObject *v, PyObject *w)
293+
gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w)
288294
{
289295
datum krec, drec;
290296
const char *failmsg = "gdbm mappings have bytes or string indices only";
297+
gdbmobject *dp = _gdbmobject_CAST(op);
291298
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
292299

293300
if (!parse_datum(v, &krec, failmsg)) {
@@ -345,12 +352,12 @@ _gdbm_gdbm_setdefault_impl(gdbmobject *self, PyObject *key,
345352
{
346353
PyObject *res;
347354

348-
res = gdbm_subscript(self, key);
355+
res = gdbm_subscript((PyObject *)self, key);
349356
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
350357
PyErr_Clear();
351-
if (gdbm_ass_sub(self, key, default_value) < 0)
358+
if (gdbm_ass_sub((PyObject *)self, key, default_value) < 0)
352359
return NULL;
353-
return gdbm_subscript(self, key);
360+
return gdbm_subscript((PyObject *)self, key);
354361
}
355362
return res;
356363
}
@@ -841,7 +848,7 @@ _gdbm_module_clear(PyObject *module)
841848
static void
842849
_gdbm_module_free(void *module)
843850
{
844-
_gdbm_module_clear((PyObject *)module);
851+
(void)_gdbm_module_clear((PyObject *)module);
845852
}
846853

847854
static PyModuleDef_Slot _gdbm_module_slots[] = {

0 commit comments

Comments
 (0)