New submission from Alexey Izbyshev <izbys...@ispras.ru>: Demo: >>> import os >>> os.chdir(-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 14] Bad address: -1 >>> os.chdir(-2) Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 9] Bad file descriptor: -2
Functions in os supporting either path or file descriptor argument (os.supports_fd) usually use the following code pattern to distinguish between those cases: if (path->fd != -1) result = fchdir(path->fd); else result = chdir(path->narrow); However, _fd_converter used by path_converter internally doesn't give any special meaning to -1 and allows any negative file descriptors. Therefore, if a user passes -1 to such function, path->narrow, which is NULL, will be used. I see two ways to fix this. 1) Make some flag in path_t indicating that it should be treated as fd and make all users check that flag. 2) Make _fd_converter raise an exception for negative descriptors. Also, I have to mention an inconsistency in reporting of bad descriptors. A handful of os functions uses fildes_converter for descriptors, which uses PyObject_AsFileDescriptor, which in turn is used in other places in Python as well (e.g. in fcntl module). PyObject_AsFileDescriptor raises a ValueError for negative descriptors instead of OSError raised by most os functions in this case. >>> os.fchdir(-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: file descriptor cannot be a negative integer (-1) ---------- messages: 312421 nosy: izbyshev priority: normal severity: normal status: open title: os: Users of path_converter don't handle fd == -1 properly type: behavior versions: Python 3.6, Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue32887> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com