Skip to content

Commit 69f53e2

Browse files
oconnor663geofft
authored andcommitted
patch libedit to stop re-broadcasting signals
1 parent cb5ec0b commit 69f53e2

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

cpython-unix/build-libedit.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,32 @@ index 614795f..4671f1b 100755
8282
fi
8383
EOF
8484

85+
# When libedit receives a signal, it re-broadcasts it to its entire pgroup.
86+
# This seems intended to preserve normal ^C behavior in "raw" mode when the
87+
# terminal's ISIG flag is cleared? However, libedit does not in fact clear
88+
# ISIG. (And Jack can't find any evidence of any version that ever did.) This
89+
# sometimes results in the parent process receiving ^C twice back-to-back,
90+
# depending on the vagaries of signal coalescing. More pathologically, if the
91+
# parent tries to signal the child directly with e.g. `kill(pid, SIGTERM)`,
92+
# libedit *signals the parent right back* (not to mention any other pgroup
93+
# siblings or grandparents). This is just wild behavior, even though it's
94+
# probably rare that it matters in practice. Patch it out. See also:
95+
# https://github.com/astral-sh/uv/issues/13919#issuecomment-2960501229.
96+
patch -p1 << "EOF"
97+
diff --git i/src/sig.c w/src/sig.c
98+
index d2b77e7..884b2dd 100644
99+
--- i/src/sig.c
100+
+++ w/src/sig.c
101+
@@ -107,7 +107,7 @@ sig_handler(int signo)
102+
sel->el_signal->sig_action[i].sa_flags = 0;
103+
sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
104+
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
105+
- (void) kill(0, signo);
106+
+ (void) raise(signo);
107+
errno = save_errno;
108+
}
109+
EOF
110+
85111
cflags="${EXTRA_TARGET_CFLAGS} -fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncursesw"
86112
ldflags="${EXTRA_TARGET_LDFLAGS} -L${TOOLS_PATH}/deps/lib"
87113

0 commit comments

Comments
 (0)