[Python-checkins] bpo-30980: Fix double close in asyncore.file_wrapper (#2789) (#2900)
Victor Stinner
webhook-mailer at python.org
Wed Jul 26 19:24:55 EDT 2017
https://github.com/python/cpython/commit/29094cec7cddd561cac16ce93443ca72d740de4d
commit: 29094cec7cddd561cac16ce93443ca72d740de4d
branch: 2.7
author: Nir Soffer <nirsof at gmail.com>
committer: Victor Stinner <victor.stinner at gmail.com>
date: 2017-07-27T01:24:52+02:00
summary:
bpo-30980: Fix double close in asyncore.file_wrapper (#2789) (#2900)
* bpo-30980: Fix close test to fail
test_close_twice was not considering the fact that file_wrapper is
duping the file descriptor. Closing the original descriptor left the
duped one open, hiding the fact that close protection is not effective.
* bpo-30980: Fix double close protection
Invalidated self.fd before closing, handling correctly the case when
os.close raises.
* bpo-30980: Fix fd leak introduced in the fixed test
files:
M Lib/asyncore.py
M Lib/test/test_asyncore.py
diff --git a/Lib/asyncore.py b/Lib/asyncore.py
index 29099bdf5c0..105982f790c 100644
--- a/Lib/asyncore.py
+++ b/Lib/asyncore.py
@@ -633,7 +633,11 @@ def getsockopt(self, level, optname, buflen=None):
write = send
def close(self):
- os.close(self.fd)
+ if self.fd < 0:
+ return
+ fd = self.fd
+ self.fd = -1
+ os.close(fd)
def fileno(self):
return self.fd
diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
index dc2b626f1e7..693d67cd8a3 100644
--- a/Lib/test/test_asyncore.py
+++ b/Lib/test/test_asyncore.py
@@ -442,6 +442,19 @@ def handle_read(self):
asyncore.loop(timeout=0.01, use_poll=True, count=2)
self.assertEqual(b"".join(data), self.d)
+ def test_close_twice(self):
+ fd = os.open(TESTFN, os.O_RDONLY)
+ f = asyncore.file_wrapper(fd)
+ os.close(fd)
+
+ os.close(f.fd) # file_wrapper dupped fd
+ with self.assertRaises(OSError):
+ f.close()
+
+ self.assertEqual(f.fd, -1)
+ # calling close twice should not fail
+ f.close()
+
class BaseTestHandler(asyncore.dispatcher):
More information about the Python-checkins
mailing list