From a5faae14cd81c019b8757c2f263799d19a2218e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Sat, 28 Nov 2015 15:48:46 +0100 Subject: Restore signal handlers when catching signals in edit_alloc() edit_catcher() performs a longjmp via rc_raise() to the matching setjmp in doit(). The latter does the same as before, so that edit_alloc() gets called again, but this time the installation of the signal handlers trashes the old handlers saved in the last call. Once readline() returns normally to edit_alloc() the wrong signal handlers get restored. The simplified call hierarchy looks like this: doit(); sigsetjmp(); edit_alloc(); oldint = sys_signal(SIGINT, edit_catcher); readline(); SIGINT -> edit_catcher(); siglongjmp(); sys_signal(SIGINT, oldint); Restoring the old signal handlers in edit_catcher() solves this. --- edit-edit.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'edit-edit.c') diff --git a/edit-edit.c b/edit-edit.c index c2a5260..7b2a9ab 100644 --- a/edit-edit.c +++ b/edit-edit.c @@ -37,7 +37,11 @@ void *edit_begin(int fd) { } +static void (*oldint)(int), (*oldquit)(int); + static void edit_catcher(int sig) { + sys_signal(SIGINT, oldint); + sys_signal(SIGQUIT, oldquit); write(2, "\n", 1); rc_raise(eError); } @@ -46,7 +50,6 @@ char *edit_alloc(void *cookie, size_t *count) { const char *r; HistEvent he; struct cookie *c = cookie; - void (*oldint)(int), (*oldquit)(int); oldint = sys_signal(SIGINT, edit_catcher); oldquit = sys_signal(SIGQUIT, edit_catcher); -- cgit v1.2.3