Skip to content

Commit 4a191f9

Browse files
[3.14] gh-143249: Fix buffer leak when overlapped operation fails to start on windows (GH-143250) (#143795)
gh-143249: Fix buffer leak when overlapped operation fails to start on windows (GH-143250) (cherry picked from commit 103a384) Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com>
1 parent a705f57 commit 4a191f9

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

Lib/test/test_asyncio/test_windows_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,25 @@ def test_popen(self):
129129
pass
130130

131131

132+
class OverlappedRefleakTests(unittest.TestCase):
133+
134+
def test_wsasendto_failure(self):
135+
ov = _overlapped.Overlapped()
136+
buf = bytearray(4096)
137+
with self.assertRaises(OSError):
138+
ov.WSASendTo(0x1234, buf, 0, ("127.0.0.1", 1))
139+
140+
def test_wsarecvfrom_failure(self):
141+
ov = _overlapped.Overlapped()
142+
with self.assertRaises(OSError):
143+
ov.WSARecvFrom(0x1234, 1024, 0)
144+
145+
def test_wsarecvfrominto_failure(self):
146+
ov = _overlapped.Overlapped()
147+
buf = bytearray(4096)
148+
with self.assertRaises(OSError):
149+
ov.WSARecvFromInto(0x1234, buf, len(buf), 0)
150+
151+
132152
if __name__ == '__main__':
133153
unittest.main()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix possible buffer leaks in Windows overlapped I/O on error handling.

Modules/overlapped.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,7 +1806,7 @@ _overlapped_Overlapped_WSASendTo_impl(OverlappedObject *self, HANDLE handle,
18061806
case ERROR_IO_PENDING:
18071807
Py_RETURN_NONE;
18081808
default:
1809-
self->type = TYPE_NOT_STARTED;
1809+
Overlapped_clear(self);
18101810
return SetFromWindowsErr(err);
18111811
}
18121812
}
@@ -1873,7 +1873,7 @@ _overlapped_Overlapped_WSARecvFrom_impl(OverlappedObject *self,
18731873
case ERROR_IO_PENDING:
18741874
Py_RETURN_NONE;
18751875
default:
1876-
self->type = TYPE_NOT_STARTED;
1876+
Overlapped_clear(self);
18771877
return SetFromWindowsErr(err);
18781878
}
18791879
}
@@ -1940,7 +1940,7 @@ _overlapped_Overlapped_WSARecvFromInto_impl(OverlappedObject *self,
19401940
case ERROR_IO_PENDING:
19411941
Py_RETURN_NONE;
19421942
default:
1943-
self->type = TYPE_NOT_STARTED;
1943+
Overlapped_clear(self);
19441944
return SetFromWindowsErr(err);
19451945
}
19461946
}

0 commit comments

Comments
 (0)