diff --git a/Modules/_stat.c b/Modules/_stat.c index 13a2bec252f448..f11ca7d23b440d 100644 --- a/Modules/_stat.c +++ b/Modules/_stat.c @@ -295,9 +295,21 @@ _PyLong_AsMode_t(PyObject *op) unsigned long value; mode_t mode; - value = PyLong_AsUnsignedLong(op); - if ((value == (unsigned long)-1) && PyErr_Occurred()) + if (PyLong_Check(op)) { + value = PyLong_AsUnsignedLong(op); + } + else { + op = PyNumber_Index(op); + if (op == NULL) { + return (mode_t)-1; + } + value = PyLong_AsUnsignedLong(op); + Py_DECREF(op); + } + + if ((value == (unsigned long)-1) && PyErr_Occurred()) { return (mode_t)-1; + } mode = (mode_t)value; if ((unsigned long)mode != value) {