]> granicus.if.org Git - python/commitdiff
http://bugs.python.org/issue5544
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Tue, 24 Mar 2009 13:21:53 +0000 (13:21 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Tue, 24 Mar 2009 13:21:53 +0000 (13:21 +0000)
Someone may have closed the file descriptor, with something like
f = open('test.test', 'w')
os.close(f.fileno())
f.close()
Protect against this by checking fd on windows before closing.

Modules/_fileio.c

index 88ee54c5f809b7c2b5a507083cb0730beffd69f5..00065611e381c5a49954c6ed5f321ef7e6bdc4e1 100644 (file)
@@ -77,11 +77,15 @@ internal_close(PyFileIOObject *self)
        if (self->fd >= 0) {
                int fd = self->fd;
                self->fd = -1;
-               Py_BEGIN_ALLOW_THREADS
-               err = close(fd);
-               if (err < 0)
-                       save_errno = errno;
-               Py_END_ALLOW_THREADS
+               /* fd is accessible and someone else may have closed it */
+               if (_PyVerify_fd(fd)) {
+                       Py_BEGIN_ALLOW_THREADS
+                       err = close(fd);
+                       if (err < 0)
+                               save_errno = errno;
+                       Py_END_ALLOW_THREADS
+               } else
+               save_errno = errno;
        }
        if (err < 0) {
                errno = save_errno;