From: Nir Soffer Date: Wed, 26 Jul 2017 23:27:08 +0000 (+0300) Subject: bpo-30980: Fix double close in asyncore.file_wrapper (#2789) (#2898) X-Git-Tag: v3.6.3rc1~197 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=25de5baf3eaebddbf879aacf49c0f614f922dc42;p=thirdparty%2FPython%2Fcpython.git bpo-30980: Fix double close in asyncore.file_wrapper (#2789) (#2898) * 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 --- diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 705e40681303..03d16838b739 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -619,8 +619,9 @@ if os.name == 'posix': def close(self): if self.fd < 0: return - os.close(self.fd) + 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 dc2f716e0bb8..07edf2275bea 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -433,7 +433,10 @@ class FileWrapperTest(unittest.TestCase): f = asyncore.file_wrapper(fd) os.close(fd) - f.close() + 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()