New submission from Oren Milman: the following code causes an assertion failure on my Windows: import io def _bad_open(*args): return 42
io.open = _bad_open 1/0 this is because _Py_DisplaySourceLine() (in Python/traceback.c) assumes that the return value of io.open() is valid. IIUC, this is actually a debug assertion failure in Windows code, in _get_osfhandle() (which is called by _Py_dup() (in Python/fileutils.c)). (also, on my Ubuntu VM, there is no assertion failure.) the following code causes a similar assertion failure: import io def _bad_open1(*args): io.open = _bad_open2 raise Exception def _bad_open2(*args): return 42 io.open = _bad_open1 1/0 this is because _Py_FindSourceFile() assumes that the return value of io.open() is valid, and returns it to _Py_DisplaySourceLine(), which also assume it is valid. I thought about adding a check in _Py_DisplaySourceLine(), before calling PyObject_AsFileDescriptor(), such as: PyObject_IsInstance(binary, (PyObject*)&PyIOBase_Type); but I am not sure whether we should use PyIOBase_Type outside of the io module. note that even with such a check, one could still write a _bad_open() that returns a subclass of IOBase, whose fileno() method returns a bad file descriptor. #15263 (and specifically https://bugs.python.org/issue15263#msg164731) mentions this. ---------- components: IO messages: 302036 nosy: Oren Milman priority: normal severity: normal status: open title: assertion failures on Windows in Python/traceback.c in case of a bad io.open type: crash versions: Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue31442> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com