]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-143249: Fix buffer leak when overlapped operation fails to start on windows (...
authorYongtao Huang <yongtaoh2022@gmail.com>
Tue, 13 Jan 2026 13:31:24 +0000 (21:31 +0800)
committerGitHub <noreply@github.com>
Tue, 13 Jan 2026 13:31:24 +0000 (19:01 +0530)
Lib/test/test_asyncio/test_windows_utils.py
Misc/NEWS.d/next/Library/2025-12-28-14-41-02.gh-issue-143249.K4vEp4.rst [new file with mode: 0644]
Modules/overlapped.c

index 97f078ff911b5a664eeecf242a34baf4e0d94161..f9ee2f4f68150a17974843134ce41be8953b1486 100644 (file)
@@ -129,5 +129,25 @@ class PopenTests(unittest.TestCase):
             pass
 
 
+class OverlappedRefleakTests(unittest.TestCase):
+
+    def test_wsasendto_failure(self):
+        ov = _overlapped.Overlapped()
+        buf = bytearray(4096)
+        with self.assertRaises(OSError):
+            ov.WSASendTo(0x1234, buf, 0, ("127.0.0.1", 1))
+
+    def test_wsarecvfrom_failure(self):
+        ov = _overlapped.Overlapped()
+        with self.assertRaises(OSError):
+            ov.WSARecvFrom(0x1234, 1024, 0)
+
+    def test_wsarecvfrominto_failure(self):
+        ov = _overlapped.Overlapped()
+        buf = bytearray(4096)
+        with self.assertRaises(OSError):
+            ov.WSARecvFromInto(0x1234, buf, len(buf), 0)
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2025-12-28-14-41-02.gh-issue-143249.K4vEp4.rst b/Misc/NEWS.d/next/Library/2025-12-28-14-41-02.gh-issue-143249.K4vEp4.rst
new file mode 100644 (file)
index 0000000..d50d9e3
--- /dev/null
@@ -0,0 +1 @@
+Fix possible buffer leaks in Windows overlapped I/O on error handling.
index 29b7b356648a539edd6ef9e912a186631fc9fb00..09b57ce4b9773abe8d0e9e0a47ff6ffd61effbc5 100644 (file)
@@ -1806,7 +1806,7 @@ _overlapped_Overlapped_WSASendTo_impl(OverlappedObject *self, HANDLE handle,
         case ERROR_IO_PENDING:
             Py_RETURN_NONE;
         default:
-            self->type = TYPE_NOT_STARTED;
+            Overlapped_clear(self);
             return SetFromWindowsErr(err);
     }
 }
@@ -1873,7 +1873,7 @@ _overlapped_Overlapped_WSARecvFrom_impl(OverlappedObject *self,
     case ERROR_IO_PENDING:
         Py_RETURN_NONE;
     default:
-        self->type = TYPE_NOT_STARTED;
+        Overlapped_clear(self);
         return SetFromWindowsErr(err);
     }
 }
@@ -1940,7 +1940,7 @@ _overlapped_Overlapped_WSARecvFromInto_impl(OverlappedObject *self,
     case ERROR_IO_PENDING:
         Py_RETURN_NONE;
     default:
-        self->type = TYPE_NOT_STARTED;
+        Overlapped_clear(self);
         return SetFromWindowsErr(err);
     }
 }