Background node process corrupts terminal state with tcsetattr() on exit
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.3k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 283
Beschreibung
- Version: v14.9.0
- Platform: NixOS 21.03, Linux 5.8.11 x86_64
- Subsystem:
ResetStdioinsrc/node.cc
In Bash, run the following:
node -e 'setTimeout(() => {}, 2000)' & sleep 1
This launches node -e 'setTimeout(() => {}, 2000)' in the background and sleep 1 in the foreground. After 1 second, control returns to Bash. After 2 seconds, Node exits and corrupts Bash’s terminal state:
- the ↑, ↓, →, ← arrow keys start printing
^[[A,^[[B,^[[C,^[[Dinstead of scrolling through the Bash history or moving the insert point, - the Tab key starts moving the cursor 8 spaces forward instead of Tab-completing the command,
- Ctrl+A and Ctrl+E print
^Aand^Einstead of jumping to the beginning and end of the command, etc.
This happens when the ResetStdio handler uses tcsetattr to “restore” the terminal to the state it was in when Node started (#24260). This interferes with Bash, which uses and expects a different terminal state than sleep 1.
(The bug is sometimes reproducible without the sleep 1 depending on whether Node records the initial terminal state before Bash updates it, but the sleep 1 makes it reliable.)
Normally, the terminal state would be protected from such undesired modifications by a background process: the kernel generates SIGTTOU to suspend the process until it’s brought to the foreground. But ResetStdio now deliberately overrides this protection by blocking SIGTTOU (#28535).
IMO, both #24260 and #28535 should be reverted. Node is a programming language; it should never make changes to the terminal state that programs did not request.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne in src/node.cc beim ResetStdio-Handler und reproduziere das Problem mit dem Bash-Befehl im Bericht. Lies den Kontext aus #24260 und #28535, einschließlich der SIGTTOU-Behandlung und des tcsetattr-Aufrufs. Erledigt ist es, wenn ein Node-Prozess im Hintergrund beendet wird, ohne Bashs Terminalverhalten zu ändern.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript, linux, nodejs
- Bereich
- operating-systems
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100