Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Description
Bug report
Bug description:
I am working on updating the version of Python that ships inOmniOS -- an illumos distribution -- from 3.12 to 3.13 and have encountered a problem with terminal settings not being properly restored when exiting from the interactive interpreter prompt.
In particular, I see the EOF character changing from 0x4 (^D) to 0x1 (^A) after a trip through repl:
bloody% stty -a | grep eofeof = ^d; eol = <undef>; eol2 = <undef>; swtch = <undef>;bloody% python3Python 3.13.1 (main, Dec 29 2024, 11:58:33) [GCC 14.2.0] on sunos5Type "help", "copyright", "credits" or "license" for more information.>>> exitbloody% stty -a | grep eofeof = ^a; eol = <undef>; eol2 = <undef>; swtch = <undef>;Using DTrace (we patch dtrace support back into python locally), I can see that all of the other settings are being restored, just not this particular control character. Here's an excerpt:
Here is the sequence that switches the terminal to raw mode. The trace shows
thatc_cc[4] is being changed from 0x4 to 0x1. This isVMIN so as expected.
15 1364 dtrace function-entry: fancy_termios.py:tcsetattr:54 15 1364 dtrace function-entry: fancy_termios.py:as_list:35 15 1366 dtrace function-return: fancy_termios.py:as_list:36 15 78613 tcgetattr:return struct termios { tcflag_t c_iflag = 0x2526 tcflag_t c_oflag = 0x5 tcflag_t c_cflag = 0xf01af tcflag_t c_lflag = 0x8a3b cc_t [19] c_cc = [ 0x3, 0x1c, 0x7f, 0x15, 0x4, 0, 0, 0, 0x11, 0x13, 0x1a, 0x19, 0x12, 0xf, 0x17, 0x16, 0x14, 0x8, 0 ]} 15 78611 tcsetattr:entry struct termios { tcflag_t c_iflag = 0x2106 tcflag_t c_oflag = 0x4 tcflag_t c_cflag = 0xf00bf tcflag_t c_lflag = 0xa31 cc_t [19] c_cc = [ 0x3, 0x1c, 0x7f, 0x15, 0x1, 0, 0, 0, 0x11, 0x13, 0x1a, 0x19, 0x12, 0xf, 0x17, 0x16, 0x14, 0x8, 0 ]}and here is where the terminal is restored:
0 1366 dtrace function-return: unix_console.py:flushoutput:489 0 1364 dtrace function-entry: fancy_termios.py:tcsetattr:54 0 1364 dtrace function-entry: fancy_termios.py:as_list:35 0 1366 dtrace function-return: fancy_termios.py:as_list:36 0 78613 tcgetattr:return struct termios { tcflag_t c_iflag = 0x2106 tcflag_t c_oflag = 0x4 tcflag_t c_cflag = 0xf00bf tcflag_t c_lflag = 0xa31 cc_t [19] c_cc = [ 0x3, 0x1c, 0x7f, 0x15, 0x1, 0, 0, 0, 0x11, 0x13, 0x1a, 0x19, 0x12, 0xf, 0x17, 0x16, 0x14, 0x8, 0 ]} 0 78611 tcsetattr:entry struct termios { tcflag_t c_iflag = 0x2526 tcflag_t c_oflag = 0x5 tcflag_t c_cflag = 0xf01af tcflag_t c_lflag = 0x8a3b cc_t [19] c_cc = [ 0x3, 0x1c, 0x7f, 0x15, 0x1, 0, 0, 0, 0x11, 0x13, 0x1a, 0x19, 0x12, 0xf, 0x17, 0x16, 0x14, 0x8, 0 ]}Everything is being restored apart from thatc_cc[4]. On illumos, VMIN and
VEOF are both defined as 4, which is legitimate but different to some other
UNIX-like environments.
The bug here is that the list of control characters is not deep copied in
fancy_termios.py.
CPython versions tested on:
3.13
Operating systems tested on:
Other