gh-111178: fix UBSan failures for gdbmobject
(GH-128178)
* fix UBSan failures for `gdbmobject` * suppress unused return values
This commit is contained in:
parent
28ffdc5702
commit
baf65715fc
@ -76,6 +76,8 @@ typedef struct {
|
|||||||
GDBM_FILE di_dbm;
|
GDBM_FILE di_dbm;
|
||||||
} gdbmobject;
|
} gdbmobject;
|
||||||
|
|
||||||
|
#define _gdbmobject_CAST(op) ((gdbmobject *)(op))
|
||||||
|
|
||||||
#include "clinic/_gdbmmodule.c.h"
|
#include "clinic/_gdbmmodule.c.h"
|
||||||
|
|
||||||
#define check_gdbmobject_open(v, err) \
|
#define check_gdbmobject_open(v, err) \
|
||||||
@ -120,27 +122,29 @@ newgdbmobject(_gdbm_state *state, const char *file, int flags, int mode)
|
|||||||
|
|
||||||
/* Methods */
|
/* Methods */
|
||||||
static int
|
static int
|
||||||
gdbm_traverse(gdbmobject *dp, visitproc visit, void *arg)
|
gdbm_traverse(PyObject *op, visitproc visit, void *arg)
|
||||||
{
|
{
|
||||||
Py_VISIT(Py_TYPE(dp));
|
Py_VISIT(Py_TYPE(op));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdbm_dealloc(gdbmobject *dp)
|
gdbm_dealloc(PyObject *op)
|
||||||
{
|
{
|
||||||
|
gdbmobject *dp = _gdbmobject_CAST(op);
|
||||||
|
PyTypeObject *tp = Py_TYPE(dp);
|
||||||
PyObject_GC_UnTrack(dp);
|
PyObject_GC_UnTrack(dp);
|
||||||
if (dp->di_dbm) {
|
if (dp->di_dbm) {
|
||||||
gdbm_close(dp->di_dbm);
|
gdbm_close(dp->di_dbm);
|
||||||
}
|
}
|
||||||
PyTypeObject *tp = Py_TYPE(dp);
|
|
||||||
tp->tp_free(dp);
|
tp->tp_free(dp);
|
||||||
Py_DECREF(tp);
|
Py_DECREF(tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Py_ssize_t
|
static Py_ssize_t
|
||||||
gdbm_length(gdbmobject *dp)
|
gdbm_length(PyObject *op)
|
||||||
{
|
{
|
||||||
|
gdbmobject *dp = _gdbmobject_CAST(op);
|
||||||
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
||||||
if (dp->di_dbm == NULL) {
|
if (dp->di_dbm == NULL) {
|
||||||
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
|
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
|
||||||
@ -185,8 +189,9 @@ gdbm_length(gdbmobject *dp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gdbm_bool(gdbmobject *dp)
|
gdbm_bool(PyObject *op)
|
||||||
{
|
{
|
||||||
|
gdbmobject *dp = _gdbmobject_CAST(op);
|
||||||
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
||||||
if (dp->di_dbm == NULL) {
|
if (dp->di_dbm == NULL) {
|
||||||
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
|
PyErr_SetString(state->gdbm_error, "GDBM object has already been closed");
|
||||||
@ -235,10 +240,11 @@ parse_datum(PyObject *o, datum *d, const char *failmsg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
gdbm_subscript(gdbmobject *dp, PyObject *key)
|
gdbm_subscript(PyObject *op, PyObject *key)
|
||||||
{
|
{
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
datum drec, krec;
|
datum drec, krec;
|
||||||
|
gdbmobject *dp = _gdbmobject_CAST(op);
|
||||||
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
||||||
|
|
||||||
if (!parse_datum(key, &krec, NULL)) {
|
if (!parse_datum(key, &krec, NULL)) {
|
||||||
@ -275,7 +281,7 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
|
|||||||
{
|
{
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
|
|
||||||
res = gdbm_subscript(self, key);
|
res = gdbm_subscript((PyObject *)self, key);
|
||||||
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
|
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
return Py_NewRef(default_value);
|
return Py_NewRef(default_value);
|
||||||
@ -284,10 +290,11 @@ _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gdbm_ass_sub(gdbmobject *dp, PyObject *v, PyObject *w)
|
gdbm_ass_sub(PyObject *op, PyObject *v, PyObject *w)
|
||||||
{
|
{
|
||||||
datum krec, drec;
|
datum krec, drec;
|
||||||
const char *failmsg = "gdbm mappings have bytes or string indices only";
|
const char *failmsg = "gdbm mappings have bytes or string indices only";
|
||||||
|
gdbmobject *dp = _gdbmobject_CAST(op);
|
||||||
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
_gdbm_state *state = PyType_GetModuleState(Py_TYPE(dp));
|
||||||
|
|
||||||
if (!parse_datum(v, &krec, failmsg)) {
|
if (!parse_datum(v, &krec, failmsg)) {
|
||||||
@ -345,12 +352,12 @@ _gdbm_gdbm_setdefault_impl(gdbmobject *self, PyObject *key,
|
|||||||
{
|
{
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
|
|
||||||
res = gdbm_subscript(self, key);
|
res = gdbm_subscript((PyObject *)self, key);
|
||||||
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
|
if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
if (gdbm_ass_sub(self, key, default_value) < 0)
|
if (gdbm_ass_sub((PyObject *)self, key, default_value) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
return gdbm_subscript(self, key);
|
return gdbm_subscript((PyObject *)self, key);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -841,7 +848,7 @@ _gdbm_module_clear(PyObject *module)
|
|||||||
static void
|
static void
|
||||||
_gdbm_module_free(void *module)
|
_gdbm_module_free(void *module)
|
||||||
{
|
{
|
||||||
_gdbm_module_clear((PyObject *)module);
|
(void)_gdbm_module_clear((PyObject *)module);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyModuleDef_Slot _gdbm_module_slots[] = {
|
static PyModuleDef_Slot _gdbm_module_slots[] = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user