8000 gh-111178: fix UBSan failures in `Modules/posixmodule.c` (GH-129788) · python/cpython@de13293 · GitHub
[go: up one dir, main page]

Skip to content

Commit de13293

Browse files
authored
gh-111178: fix UBSan failures in Modules/posixmodule.c (GH-129788)
Fix UBSan failures for `DirEntry`, `ScandirIterator` Use better semantic naming
1 parent c070aba commit de13293

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

Modules/posixmodule.c

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8256,13 +8256,13 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority)
82568256
}
82578257

82588258
static PyObject *
8259-
os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(ignored))
8259+
os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(dummy))
82608260
{
82618261
return Py_BuildValue("(O(N))", Py_TYPE(self), PyStructSequence_GetItem(self, 0));
82628262
}
82638263

82648264
static PyMethodDef os_sched_param_reduce_method = {
8265-
"__reduce__", (PyCFunction)os_sched_param_reduce, METH_NOARGS|METH_COEXIST, NULL,
8265+
"__reduce__", os_sched_param_reduce, METH_NOARGS | METH_COEXIST, NULL,
82668266
};
82678267

82688268
PyDoc_VAR(os_sched_param__doc__);
@@ -15584,9 +15584,12 @@ typedef struct {
1558415584
#endif
1558515585
} DirEntry;
1558615586

15587+
#define DirEntry_CAST(op) ((DirEntry *)(op))
15588+
1558715589
static void
15588-
DirEntry_dealloc(DirEntry *entry)
15590+
DirEntry_dealloc(PyObject *op)
1558915591
{
15592+
DirEntry *entry = DirEntry_CAST(op);
1559015593
PyTypeObject *tp = Py_TYPE(entry);
1559115594
Py_XDECREF(entry->name);
1559215595
Py_XDECREF(entry->path);
@@ -15915,8 +15918,9 @@ os_DirEntry_inode_impl(DirEntry *self)
1591515918
}
1591615919

1591715920
static PyObject *
15918-
DirEntry_repr(DirEntry *self)
15921+
DirEntry_repr(PyObject *op)
1591915922
{
15923+
DirEntry *self = DirEntry_CAST(op);
1592015924
return PyUnicode_FromFormat("<DirEntry %R>", self->name);
1592115925
}
1592215926

@@ -16179,6 +16183,8 @@ typedef struct {
1617916183
#endif
1618016184
} ScandirIterator;
1618116185

16186+
#define ScandirIterator_CAST(op) ((ScandirIterator *)(op))
16187+
1618216188
#ifdef MS_WINDOWS
1618316189

1618416190
static int
@@ -16202,8 +16208,9 @@ ScandirIterator_closedir(ScandirIterator *iterator)
1620216208
}
1620316209

1620416210
static PyObject *
16205-
ScandirIterator_iternext(ScandirIterator *iterator)
16211+
ScandirIterator_iternext(PyObject *op)
1620616212
{
16213+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1620716214
WIN32_FIND_DATAW *file_data = &iterator->file_data;
1620816215
BOOL success;
1620916216
PyObject *entry;
@@ -16273,8 +16280,9 @@ ScandirIterator_closedir(ScandirIterator *iterator)
1627316280
}
1627416281

1627516282
static PyObject *
16276-
ScandirIterator_iternext(ScandirIterator *iterator)
16283+
ScandirIterator_iternext(PyObject *op)
1627716284
{
16285+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1627816286
struct dirent *direntp;
1627916287
Py_ssize_t name_len;
1628016288
int is_dot;
@@ -16326,37 +16334,40 @@ ScandirIterator_iternext(ScandirIterator *iterator)
1632616334
#endif
1632716335

1632816336
static PyObject *
16329-
ScandirIterator_close(ScandirIterator *self, PyObject *args)
16337+
ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(dummy))
1633016338
{
16339+
ScandirIterator *self = ScandirIterator_CAST(op);
1633116340
ScandirIterator_closedir(self);
1633216341
Py_RETURN_NONE;
1633316342
}
1633416343

1633516344
static PyObject *
16336-
ScandirIterator_enter(PyObject *self, PyObject *args)
16345+
ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(dummy))
1633716346
{
1633816347
return Py_NewRef(self);
1633916348
}
1634016349

1634116350
static PyObject *
16342-
ScandirIterator_exit(ScandirIterator *self, PyObject *args)
16351+
ScandirIterator_exit(PyObject *op, PyObject *Py_UNUSED(args))
1634316352
{
16353+
ScandirIterator *self = ScandirIterator_CAST(op);
1634416354
ScandirIterator_closedir(self);
1634516355
Py_RETURN_NONE;
1634616356
}
1634716357

1634816358
static void
16349-
ScandirIterator_finalize(ScandirIterator *iterator)
16359+
ScandirIterator_finalize(PyObject *op)
1635016360
{
16351-
16361+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1635216362
/* Save the current exception, if any. */
1635316363
PyObject *exc = PyErr_GetRaisedException();
1635416364

1635516365
if (!ScandirIterator_is_closed(iterator)) {
1635616366
ScandirIterator_closedir(iterator);
1635716367

16358-
if (PyErr_ResourceWarning((PyObject *)iterator, 1,
16359-
"unclosed scandir iterator %R", iterator)) {
16368+
if (PyErr_ResourceWarning(op, 1,
16369+
"unclosed scandir iterator %R", iterator))
16370+
{
1636016371
/* Spurious errors can appear at shutdown */
1636116372
if (PyErr_ExceptionMatches(PyExc_Warning)) {
1636216373
PyErr_FormatUnraisable("Exception ignored while finalizing "
@@ -16372,21 +16383,21 @@ ScandirIterator_finalize(ScandirIterator *iterator)
1637216383
}
1637316384

1637416385
static void
16375-
ScandirIterator_dealloc(ScandirIterator *iterator)
16386+
ScandirIterator_dealloc(PyObject *op)
1637616387
{
16377-
PyTypeObject *tp = Py_TYPE(iterator);
16378-
if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0)
16388+
PyTypeObject *tp = Py_TYPE(op);
16389+
if (PyObject_CallFinalizerFromDealloc(op) < 0)
1637916390
return;
1638016391

1638116392
freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
16382-
free_func(iterator);
16393+
free_func(op);
1638316394
Py_DECREF(tp);
1638416395
}
1638516396

1638616397
static PyMethodDef ScandirIterator_methods[] = {
16387-
{"__enter__", (PyCFunction)ScandirIterator_enter, METH_NOARGS},
16388-
{"__exit__", (PyCFunction)ScandirIterator_exit, METH_VARARGS},
16389-
{"close", (PyCFunction)ScandirIterator_close, METH_NOARGS},
16398+
{"__enter__", ScandirIterator_enter, METH_NOARGS},
16399+
{"__exit__", ScandirIterator_exit, METH_VARARGS},
16400+
{"close", ScandirIterator_close, METH_NOARGS},
1639016401
{NULL}
1639116402
};
1639216403

0 commit comments

Comments
 (0)
0