8000 gh-111178: fix UBSan failures in `Modules/_struct.c` by picnixz · Pull Request #129793 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-111178: fix UBSan failures in Modules/_struct.c #129793

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Feb 23, 2025
Prev Previous commit
Next Next commit
Do Do not use _ + capital letter in new code as it is also UB.
  • Loading branch information
picnixz committed Feb 8, 2025
commit 0e700b0b070593b1294d096f5c651bc6f1231027
22 changes: 11 additions & 11 deletions Modules/_struct.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ typedef struct {
PyObject *weakreflist; /* List of weak references */
} PyStructObject;

#define _PyStructObject_CAST(op) ((PyStructObject *)(op))
#define PyStructObject_CAST(op) ((PyStructObject *)(op))
#define PyStruct_Check(op, state) PyObject_TypeCheck(op, (PyTypeObject *)(state)->PyStructType)

/* Define various structs to figure out the alignments of types */
Expand Down Expand Up @@ -1856,15 +1856,15 @@ Struct___init___impl(PyStructObject *self, PyObject *format)
static int
s_clear(PyObject *op)
{
PyStructObject *s = _PyStructObject_CAST(op);
PyStructObject *s = PyStructObject_CAST(op);
Py_CLEAR(s->s_format);
return 0;
}

static int
s_traverse(PyObject *op, visitproc visit, void *arg)
{
PyStructObject *s = _PyStructObject_CAST(op);
PyStructObject *s = PyStructObject_CAST(op);
Py_VISIT(Py_TYPE(s));
Py_VISIT(s->s_format);
return 0;
Expand All @@ -1873,7 +1873,7 @@ s_traverse(PyObject *op, visitproc visit, void *arg)
static void
s_dealloc(PyObject *op)
{
PyStructObject *s = _PyStructObject_CAST(op);
PyStructObject *s = PyStructObject_CAST(op);
PyTypeObject *tp = Py_TYPE(s);
PyObject_GC_UnTrack(s);
if (s->weakreflist != NULL) {
Expand Down Expand Up @@ -2277,7 +2277,7 @@ s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
_structmodulestate *state = get_struct_state_structinst(self);

/* Validate arguments. */
soself = _PyStructObject_CAST(self);
soself = PyStructObject_CAST(self);
assert(PyStruct_Check(self, state));
assert(soself->s_codes != NULL);
if (nargs != soself->s_len)
Expand Down Expand Up @@ -2322,7 +2322,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
_structmodulestate *state = get_struct_state_structinst(self);

/* Validate arguments. +1 is for the first arg as buffer. */
soself = _PyStructObject_CAST(self);
soself = PyStructObject_CAST(self);
assert(PyStruct_Check(self, state));
assert(soself->s_codes != NULL);
if (nargs != (soself->s_len + 2))
Expand Down Expand Up @@ -2410,15 +2410,15 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
static PyObject *
s_get_format(PyObject *op, void *Py_UNUSED(closure))
{
PyStructObject *self = _PyStructObject_CAST(op);
PyStructObject *self = PyStructObject_CAST(op);
return PyUnicode_FromStringAndSize(PyBytes_AS_STRING(self->s_format),
PyBytes_GET_SIZE(self->s_format));
}

static PyObject *
s_get_size(PyObject *op, void *Py_UNUSED(closure))
{
PyStructObject *self = _PyStructObject_CAST(op);
PyStructObject *self = PyStructObject_CAST(op);
return PyLong_FromSsize_t(self->s_size);
}

Expand All @@ -2428,7 +2428,7 @@ PyDoc_STRVAR(s_sizeof__doc__,
static PyObject *
s_sizeof(PyObject *op, PyObject *Py_UNUSED(unused))
{
PyStructObject *self = _PyStructObject_CAST(op);
PyStructObject *self = PyStructObject_CAST(op);
size_t size = _PyObject_SIZE(Py_TYPE(self)) + sizeof(formatcode);
for (formatcode *code = self->s_codes; code->fmtdef != NULL; code++) {
size += sizeof(formatcode);
Expand All @@ -2439,7 +2439,7 @@ s_sizeof(PyObject *op, PyObject *Py_UNUSED(unused))
static PyObject *
s_repr(PyObject *op)
{
PyStructObject *self = _PyStructObject_CAST(op);
PyStructObject *self = PyStructObject_CAST(op);
PyObject* fmt = PyUnicode_FromStringAndSize(
PyBytes_AS_STRING(self->s_format), PyBytes_GET_SIZE(self->s_format));
if (fmt == NULL) {
Expand Down Expand Up @@ -2525,7 +2525,7 @@ cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr)
return 0;
}
if (s_object != NULL) {
*ptr = _PyStructObject_CAST(s_object);
*ptr = PyStructObject_CAST(s_object);
return Py_CLEANUP_SUPPORTED;
}

Expand Down
0