8000 fix UBSan failures for `ScandirIterator` · python/cpython@b09c08b · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit b09c08b

Browse files
committed
fix UBSan failures for ScandirIterator
1 parent f53e72a commit b09c08b

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

Modules/posixmodule.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16122,6 +16122,8 @@ typedef struct {
1612216122
#endif
1612316123
} ScandirIterator;
1612416124

16125+
#define ScandirIterator_CAST(op) ((ScandirIterator *)(op))
16126+
1612516127
#ifdef MS_WINDOWS
1612616128

1612716129
static int
@@ -16145,8 +16147,9 @@ ScandirIterator_closedir(ScandirIterator *iterator)
1614516147
}
1614616148

1614716149
static PyObject *
16148-
ScandirIterator_iternext(ScandirIterator *iterator)
16150+
ScandirIterator_iternext(PyObject *op)
1614916151
{
16152+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1615016153
WIN32_FIND_DATAW *file_data = &iterator->file_data;
1615116154
BOOL success;
1615216155
PyObject *entry;
@@ -16216,8 +16219,9 @@ ScandirIterator_closedir(ScandirIterator *iterator)
1621616219
}
1621716220

1621816221
static PyObject *
16219-
ScandirIterator_iternext(ScandirIterator *iterator)
16222+
ScandirIterator_iternext(PyObject *op)
1622016223
{
16224+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1622116225
struct dirent *direntp;
1622216226
Py_ssize_t name_len;
1622316227
int is_dot;
@@ -16269,40 +16273,43 @@ ScandirIterator_iternext(ScandirIterator *iterator)
1626916273
#endif
1627016274

1627116275
static PyObject *
16272-
ScandirIterator_close(ScandirIterator *self, PyObject *args)
16276+
ScandirIterator_close(PyObject *op, PyObject *Py_UNUSED(args))
1627316277
{
16278+
ScandirIterator *self = ScandirIterator_CAST(op);
1627416279
ScandirIterator_closedir(self);
1627516280
Py_RETURN_NONE;
1627616281
}
1627716282

1627816283
static PyObject *
16279-
ScandirIterator_enter(PyObject *self, PyObject *args)
16284+
ScandirIterator_enter(PyObject *self, PyObject *Py_UNUSED(args))
1628016285
{
1628116286
return Py_NewRef(self);
1628216287
}
1628316288

1628416289
static PyObject *
16285-
ScandirIterator_exit(ScandirIterator *self, PyObject *args)
16290+
ScandirIterator_exit(PyObject *op, PyObject *Py_UNUSED(args))
1628616291
{
16292+
ScandirIterator *self = ScandirIterator_CAST(op);
1628716293
ScandirIterator_closedir(self);
1628816294
Py_RETURN_NONE;
1628916295
}
1629016296

1629116297
static void
16292-
ScandirIterator_finalize(ScandirIterator *iterator)
16298+
ScandirIterator_finalize(PyObject *op)
1629316299
{
16294-
16300+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1629516301
/* Save the current exception, if any. */
1629616302
PyObject *exc = PyErr_GetRaisedException();
1629716303

1629816304
if (!ScandirIterator_is_closed(iterator)) {
1629916305
ScandirIterator_closedir(iterator);
1630016306

16301-
if (PyErr_ResourceWarning((PyObject *)iterator, 1,
16302-
"unclosed scandir iterator %R", iterator)) {
16307+
if (PyErr_ResourceWarning< 8000 /span>(op, 1,
16308+
"unclosed scandir iterator %R", iterator))
16309+
{
1630316310
/* Spurious errors can appear at shutdown */
1630416311
if (PyErr_ExceptionMatches(PyExc_Warning)) {
16305-
PyErr_WriteUnraisable((PyObject *) iterator);
16312+
PyErr_WriteUnraisable(op);
1630616313
}
1630716314
}
1630816315
}
@@ -16314,10 +16321,11 @@ ScandirIterator_finalize(ScandirIterator *iterator)
1631416321
}
1631516322

1631616323
static void
16317-
ScandirIterator_dealloc(ScandirIterator *iterator)
16324+
ScandirIterator_dealloc(PyObject *op)
1631816325
{
16326+
ScandirIterator *iterator = ScandirIterator_CAST(op);
1631916327
PyTypeObject *tp = Py_TYPE(iterator);
16320-
if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0)
16328+
if (PyObject_CallFinalizerFromDealloc(op) < 0)
1632116329
return;
1632216330

1632316331
freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
@@ -16326,9 +16334,9 @@ ScandirIterator_dealloc(ScandirIterator *iterator)
1632616334
}
1632716335

1632816336
static PyMethodDef ScandirIterator_methods[] = {
16329-
{"__enter__", (PyCFunction)ScandirIterator_enter, METH_NOARGS},
16330-
{"__exit__", (PyCFunction)ScandirIterator_exit, METH_VARARGS},
16331-
{"close", (PyCFunction)ScandirIterator_close, METH_NOARGS},
16337+
{"__enter__", ScandirIterator_enter, METH_NOARGS},
16338+
{"__exit__", ScandirIterator_exit, METH_VARARGS},
16339+
{"close", ScandirIterator_close, METH_NOARGS},
1633216340
{NULL}
1633316341
};
1633416342

0 commit comments

Comments
 (0)
0