]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-134744: Fix fcntl error handling (GH-134748) (GH-134795) (#134798)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 28 May 2025 10:54:53 +0000 (12:54 +0200)
committerGitHub <noreply@github.com>
Wed, 28 May 2025 10:54:53 +0000 (12:54 +0200)
[3.14] gh-134744: Fix fcntl error handling (GH-134748) (GH-134795)

gh-134744: Fix fcntl error handling (GH-134748)

Fix also reference leak on buffer overflow.
(cherry picked from commit 8a6a6f39c869a6601babc31592e156ce22478a47)

(cherry picked from commit 9300a596d37d058e6e58d00a2ad70617c863a3de)

Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/test_fcntl.py
Lib/test/test_ioctl.py

index b84c98ef3a2972d41f02d74729ed49968d806c1d..0570257c5230d5102d6a1bded9ff4af34c18b9bc 100644 (file)
@@ -11,7 +11,7 @@ from test.support import (
     cpython_only, get_pagesize, is_apple, requires_subprocess, verbose
 )
 from test.support.import_helper import import_module
-from test.support.os_helper import TESTFN, unlink
+from test.support.os_helper import TESTFN, unlink, make_bad_fd
 
 
 # Skip test if no fcntl module.
@@ -228,6 +228,15 @@ class TestFcntl(unittest.TestCase):
             os.close(test_pipe_r)
             os.close(test_pipe_w)
 
+    @unittest.skipUnless(hasattr(fcntl, 'F_DUPFD'), 'need fcntl.F_DUPFD')
+    def test_bad_fd(self):
+        # gh-134744: Test error handling
+        fd = make_bad_fd()
+        with self.assertRaises(OSError):
+            fcntl.fcntl(fd, fcntl.F_DUPFD, 0)
+        with self.assertRaises(OSError):
+            fcntl.fcntl(fd, fcntl.F_DUPFD, b'\0' * 1024)
+
 
 if __name__ == '__main__':
     unittest.main()
index 980a20aadc0bde09814d76317398b9b7b72b5e10..9531282d6bab7d615671301d252f8bf7c4c8f822 100644 (file)
@@ -5,7 +5,7 @@ import sys
 import threading
 import unittest
 from test import support
-from test.support import threading_helper
+from test.support import os_helper, threading_helper
 from test.support.import_helper import import_module
 fcntl = import_module('fcntl')
 termios = import_module('termios')
@@ -208,6 +208,15 @@ class IoctlTestsPty(unittest.TestCase):
         new_winsz = fcntl.ioctl(self.master_fd, set_winsz_opcode_pos, our_winsz)
         new_winsz = fcntl.ioctl(self.master_fd, set_winsz_opcode_maybe_neg, our_winsz)
 
+    @unittest.skipUnless(hasattr(fcntl, 'FICLONE'), 'need fcntl.FICLONE')
+    def test_bad_fd(self):
+        # gh-134744: Test error handling
+        fd = os_helper.make_bad_fd()
+        with self.assertRaises(OSError):
+            fcntl.ioctl(fd, fcntl.FICLONE, fd)
+        with self.assertRaises(OSError):
+            fcntl.ioctl(fd, fcntl.FICLONE, b'\0' * 1024)
+
 
 if __name__ == "__main__":
     unittest.main()