Skip to content

Commit 28d2105

Browse files
authored
Merge branch 'main' into gh-156443-longobject
2 parents 8b481db + b0dda15 commit 28d2105

3 files changed

Lines changed: 26 additions & 4 deletions

File tree

‎Lib/idlelib/idle_test/test_rpc.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
"Test rpc, coverage 20%."
22

33
from idlelib import rpc
4+
import socket
5+
import struct
46
import unittest
57

68

9+
class SocketIOTest(unittest.TestCase):
10+
11+
def test_reconnect_discards_partial_packet(self):
12+
# gh-89544: RPCClient.accept() reinitializes the SocketIO after
13+
# a restart; a partially received packet must not be kept.
14+
old_sock, old_peer = socket.socketpair()
15+
new_sock, new_peer = socket.socketpair()
16+
with old_sock, old_peer, new_sock, new_peer:
17+
sockio = rpc.SocketIO(old_sock)
18+
old_peer.sendall(struct.pack('<i', 100) + b'x' * 10)
19+
self.assertIsNone(sockio.pollpacket(1))
20+
sockio.close()
21+
rpc.SocketIO.__init__(sockio, new_sock)
22+
new_peer.sendall(struct.pack('<i', 3) + b'abc')
23+
self.assertEqual(sockio.pollpacket(1), b'abc')
24+
25+
726

827
class CodePicklerTest(unittest.TestCase):
928

‎Lib/idlelib/rpc.py‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ def __init__(self, sock, objtable=None, debugging=None):
139139
self.objtable = objtable
140140
self.responses = {}
141141
self.cvars = {}
142+
# Receive buffer state. A new connection must not inherit a
143+
# partially received packet from the old one (gh-89544).
144+
self.buff = b''
145+
self.bufneed = 4
146+
self.bufstate = 0 # meaning: 0 => reading count; 1 => reading data
142147

143148
def close(self):
144149
sock = self.sock
@@ -345,10 +350,6 @@ def putmessage(self, message):
345350
raise OSError("socket no longer exists")
346351
s = s[n:]
347352

348-
buff = b''
349-
bufneed = 4
350-
bufstate = 0 # meaning: 0 => reading count; 1 => reading data
351-
352353
def pollpacket(self, wait):
353354
self._stage0()
354355
if len(self.buff) < self.bufneed:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix IDLE hanging after Restart Shell while receiving a large output from the
2+
user process.

0 commit comments

Comments
 (0)