Skip to content

Commit be602fc

Browse files
[3.13] gh-143249: Fix buffer leak when overlapped operation fails to start on windows (GH-143250) (#143796)
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 0770c78 commit be602fc

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
@@ -1794,7 +1794,7 @@ _overlapped_Overlapped_WSASendTo_impl(OverlappedObject *self, HANDLE handle,
17941794
case ERROR_IO_PENDING:
17951795
Py_RETURN_NONE;
17961796
default:
1797-
self->type = TYPE_NOT_STARTED;
1797+
Overlapped_clear(self);
17981798
return SetFromWindowsErr(err);
17991799
}
18001800
}
@@ -1868,7 +1868,7 @@ _overlapped_Overlapped_WSARecvFrom_impl(OverlappedObject *self,
18681868
case ERROR_IO_PENDING:
18691869
Py_RETURN_NONE;
18701870
default:
1871-
self->type = TYPE_NOT_STARTED;
1871+
Overlapped_clear(self);
18721872
return SetFromWindowsErr(err);
18731873
}
18741874
}
@@ -1935,7 +1935,7 @@ _overlapped_Overlapped_WSARecvFromInto_impl(OverlappedObject *self,
19351935
case ERROR_IO_PENDING:
19361936
Py_RETURN_NONE;
19371937
default:
1938-
self->type = TYPE_NOT_STARTED;
1938+
Overlapped_clear(self);
19391939
return SetFromWindowsErr(err);
19401940
}
19411941
}

0 commit comments

Comments
 (0)