Background node process corrupts terminal state with tcsetattr() on exit
Personne n'a encore pris cette issue.
- Langage dominant
- JavaScript
- Étoiles
- 122k
- Forks
- 37.3k
- Merge moyen
- 4 j 2 h
- PR mergées (30 j)
- 283
Description
- 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.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans src/node.cc, au niveau du gestionnaire ResetStdio, et reproduisez le problème avec la commande Bash du rapport. Lisez le contexte de #24260 et #28535, notamment la gestion de SIGTTOU et l’appel à tcsetattr. C’est terminé lorsqu’un processus Node en arrière-plan se termine sans modifier le comportement du terminal de Bash.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, linux, nodejs
- Domaine
- operating-systems
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100