From f1c59330ac727b13bafe732a6e77ba180229c070 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 14 Oct 2023 08:50:41 +0300 Subject: [PATCH] gh-110392: Fix tty functions (GH-110642) * tty.setraw() and tty.setcbreak() previously returned partially modified list of the original tty attributes. Now they return the correct list of the original tty attributes * tty.cfmakeraw() and tty.cfmakecbreak() now make a copy of the list of special characters before modifying it. (cherry picked from commit 84e2096fbdea880799f2fdb3f0992a8961106bed) Co-authored-by: Serhiy Storchaka --- Lib/test/test_tty.py | 8 ++++++-- Lib/tty.py | 2 ++ .../2023-10-10-17-56-41.gh-issue-110392.6g6CnP.rst | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-10-10-17-56-41.gh-issue-110392.6g6CnP.rst diff --git a/Lib/test/test_tty.py b/Lib/test/test_tty.py index 6993047492b5ec..af20864aac361e 100644 --- a/Lib/test/test_tty.py +++ b/Lib/test/test_tty.py @@ -58,7 +58,9 @@ def test_cfmakecbreak(self): self.assertEqual(mode[5], self.mode[5]) def test_setraw(self): - mode = tty.setraw(self.fd) + mode0 = termios.tcgetattr(self.fd) + mode1 = tty.setraw(self.fd) + self.assertEqual(mode1, mode0) mode2 = termios.tcgetattr(self.fd) self.check_raw(mode2) mode3 = tty.setraw(self.fd, termios.TCSANOW) @@ -67,7 +69,9 @@ def test_setraw(self): tty.setraw(fd=self.fd, when=termios.TCSANOW) def test_setcbreak(self): - mode = tty.setcbreak(self.fd) + mode0 = termios.tcgetattr(self.fd) + mode1 = tty.setcbreak(self.fd) + self.assertEqual(mode1, mode0) mode2 = termios.tcgetattr(self.fd) self.check_cbreak(mode2) mode3 = tty.setcbreak(self.fd, termios.TCSANOW) diff --git a/Lib/tty.py b/Lib/tty.py index 7d916029ff2ce9..283e5c334f5751 100644 --- a/Lib/tty.py +++ b/Lib/tty.py @@ -39,6 +39,7 @@ def cfmakeraw(mode): # Case B: MIN>0, TIME=0 # A pending read shall block until MIN (here 1) bytes are received, # or a signal is received. + mode[CC] = list(mode[CC]) mode[CC][VMIN] = 1 mode[CC][VTIME] = 0 @@ -54,6 +55,7 @@ def cfmakecbreak(mode): # Case B: MIN>0, TIME=0 # A pending read shall block until MIN (here 1) bytes are received, # or a signal is received. + mode[CC] = list(mode[CC]) mode[CC][VMIN] = 1 mode[CC][VTIME] = 0 diff --git a/Misc/NEWS.d/next/Library/2023-10-10-17-56-41.gh-issue-110392.6g6CnP.rst b/Misc/NEWS.d/next/Library/2023-10-10-17-56-41.gh-issue-110392.6g6CnP.rst new file mode 100644 index 00000000000000..47e4e8ee1f058d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-10-10-17-56-41.gh-issue-110392.6g6CnP.rst @@ -0,0 +1,4 @@ +Fix :func:`tty.setraw` and :func:`tty.setcbreak`: previously they returned +partially modified list of the original tty attributes. +:func:`tty.cfmakeraw` and :func:`tty.cfmakecbreak` now make a copy of the +list of special characters before modifying it.