From bede4452703703743072924e27861ad5c6ff606c Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Sat, 13 May 2023 01:59:43 +0100 Subject: [PATCH 1/5] Fix unsafe .abort() call --- aiohttp/connector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiohttp/connector.py b/aiohttp/connector.py index 959a81c47a4..02875a968a0 100644 --- a/aiohttp/connector.py +++ b/aiohttp/connector.py @@ -354,7 +354,7 @@ def _cleanup_closed(self) -> None: self._cleanup_closed_handle.cancel() for transport in self._cleanup_closed_transports: - if transport is not None: + if transport is not None and not transport.is_closing(): transport.abort() self._cleanup_closed_transports = [] @@ -409,7 +409,7 @@ def _close_immediately(self) -> List["asyncio.Future[None]"]: # TODO (A.Yushovskiy, 24-May-2019) collect transp. closing futures for transport in self._cleanup_closed_transports: - if transport is not None: + if transport is not None and not transport.is_closing(): transport.abort() return waiters From b8ef810c1f2d57d549114e4f4753dd35429ed424 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Sat, 13 May 2023 02:03:54 +0100 Subject: [PATCH 2/5] Create 7280.bugfix --- CHANGES/7280.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 CHANGES/7280.bugfix diff --git a/CHANGES/7280.bugfix b/CHANGES/7280.bugfix new file mode 100644 index 00000000000..6fc6ef28f80 --- /dev/null +++ b/CHANGES/7280.bugfix @@ -0,0 +1 @@ +Fixed an exception and possible memory leak in Python 3.11.1+ -- by :user:`Dreamsorcerer` From fb9817589ae63d18968c3ba8b2c3ab71eb06ee57 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Sat, 13 May 2023 13:14:39 +0100 Subject: [PATCH 3/5] Update test_connector.py --- tests/test_connector.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_connector.py b/tests/test_connector.py index e6ff68592cb..eb894fca1aa 100644 --- a/tests/test_connector.py +++ b/tests/test_connector.py @@ -1179,7 +1179,8 @@ async def test_cleanup_closed(loop: Any, mocker: Any) -> None: mocker.spy(loop, "call_at") conn = aiohttp.BaseConnector(enable_cleanup_closed=True) - tr = mock.Mock() + tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) + tr.is_closing.return_value = False conn._cleanup_closed_handle = cleanup_closed_handle = mock.Mock() conn._cleanup_closed_transports = [tr] conn._cleanup_closed() @@ -1192,7 +1193,8 @@ async def test_cleanup_closed(loop: Any, mocker: Any) -> None: async def test_cleanup_closed_disabled(loop: Any, mocker: Any) -> None: conn = aiohttp.BaseConnector(enable_cleanup_closed=False) - tr = mock.Mock() + tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) + tr.is_closing.return_value = False conn._cleanup_closed_transports = [tr] conn._cleanup_closed() assert tr.abort.called @@ -1343,14 +1345,15 @@ async def test_close_cancels_cleanup_handle(loop: Any) -> None: async def test_close_abort_closed_transports(loop: Any) -> None: - tr = mock.Mock() + tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) + tr.is_closing.return_value = True conn = aiohttp.BaseConnector() conn._cleanup_closed_transports.append(tr) await conn.close() assert not conn._cleanup_closed_transports - assert tr.abort.called + assert not tr.abort.called assert conn.closed From 66eab42fa6860b61ab0e63474d8c7ddf42b43601 Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Sat, 13 May 2023 13:21:08 +0100 Subject: [PATCH 4/5] Update test_connector.py --- tests/test_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_connector.py b/tests/test_connector.py index eb894fca1aa..9617e88a77d 100644 --- a/tests/test_connector.py +++ b/tests/test_connector.py @@ -1344,7 +1344,7 @@ async def test_close_cancels_cleanup_handle(loop: Any) -> None: assert conn._cleanup_handle is None -async def test_close_abort_closed_transports(loop: Any) -> None: +async def test_close_abort_closed_transports(loop: Any, mocker: Any) -> None: tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) tr.is_closing.return_value = True From 6832189593362fb07609718f79ef256947e50a4e Mon Sep 17 00:00:00 2001 From: Sam Bull Date: Sat, 13 May 2023 13:49:52 +0100 Subject: [PATCH 5/5] Update test_connector.py --- tests/test_connector.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_connector.py b/tests/test_connector.py index 9617e88a77d..013dd6dc5d2 100644 --- a/tests/test_connector.py +++ b/tests/test_connector.py @@ -1179,7 +1179,7 @@ async def test_cleanup_closed(loop: Any, mocker: Any) -> None: mocker.spy(loop, "call_at") conn = aiohttp.BaseConnector(enable_cleanup_closed=True) - tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) + tr = mock.create_autospec(asyncio.Transport, spec_set=True, instance=True) tr.is_closing.return_value = False conn._cleanup_closed_handle = cleanup_closed_handle = mock.Mock() conn._cleanup_closed_transports = [tr] @@ -1190,10 +1190,10 @@ async def test_cleanup_closed(loop: Any, mocker: Any) -> None: assert cleanup_closed_handle.cancel.called -async def test_cleanup_closed_disabled(loop: Any, mocker: Any) -> None: +async def test_cleanup_closed_disabled(loop: Any) -> None: conn = aiohttp.BaseConnector(enable_cleanup_closed=False) - tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) + tr = mock.create_autospec(asyncio.Transport, spec_set=True, instance=True) tr.is_closing.return_value = False conn._cleanup_closed_transports = [tr] conn._cleanup_closed() @@ -1344,8 +1344,8 @@ async def test_close_cancels_cleanup_handle(loop: Any) -> None: assert conn._cleanup_handle is None -async def test_close_abort_closed_transports(loop: Any, mocker: Any) -> None: - tr = mocker.create_autospec(asyncio.Transport, spec_set=True, instance=True) +async def test_close_abort_closed_transports(loop: Any) -> None: + tr = mock.create_autospec(asyncio.Transport, spec_set=True, instance=True) tr.is_closing.return_value = True conn = aiohttp.BaseConnector()