]> granicus.if.org Git - python/commitdiff
Issue #26384: Fix UnboundLocalError in socket._sendfile_use_sendfile
authorBerker Peksag <berker.peksag@gmail.com>
Sat, 17 Sep 2016 20:22:06 +0000 (23:22 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Sat, 17 Sep 2016 20:22:06 +0000 (23:22 +0300)
Lib/socket.py
Lib/test/test_socket.py
Misc/NEWS

index 6dddfe1d34b5e22b1d9047cfe01acf4ac4f8cce8..a9cab32e31ebe30f74b716a7490165c9a790c3d4 100644 (file)
@@ -258,7 +258,7 @@ class socket(_socket.socket):
                 raise _GiveupOnSendfile(err)  # not a regular file
             try:
                 fsize = os.fstat(fileno).st_size
-            except OSError:
+            except OSError as err:
                 raise _GiveupOnSendfile(err)  # not a regular file
             if not fsize:
                 return 0  # empty file
index 4b047ee76ab790a4277e42b796f5a52cd2a105ea..c5975c8c9e5613ea418d21e516f8b7dd9376fa1e 100644 (file)
@@ -1447,6 +1447,25 @@ class GeneralModuleTests(unittest.TestCase):
             self.assertEqual(s.family, 42424)
             self.assertEqual(s.type, 13331)
 
+    @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
+    def test__sendfile_use_sendfile(self):
+        class File:
+            def __init__(self, fd):
+                self.fd = fd
+
+            def fileno(self):
+                return self.fd
+        with socket.socket() as sock:
+            fd = os.open(os.curdir, os.O_RDONLY)
+            os.close(fd)
+            with self.assertRaises(socket._GiveupOnSendfile):
+                sock._sendfile_use_sendfile(File(fd))
+            with self.assertRaises(OverflowError):
+                sock._sendfile_use_sendfile(File(2**1000))
+            with self.assertRaises(TypeError):
+                sock._sendfile_use_sendfile(File(None))
+
+
 @unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
 class BasicCANTest(unittest.TestCase):
 
index 8fbdd226340abd3799cadfc9b40cce5b0afcb574..d3e9fd72e69158490623a94029422a48d0e8a382 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -71,6 +71,8 @@ Core and Builtins
 Library
 -------
 
+- Fix UnboundLocalError in socket._sendfile_use_sendfile.
+
 - Issue #28075: Check for ERROR_ACCESS_DENIED in Windows implementation of
   os.stat().  Patch by Eryk Sun.