From 17c5472c5a3eb548e9d06555a8863f83eaee9f26 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 4 Dec 2018 21:21:32 +0100 Subject: [PATCH] bc: switch to SA_RESTART signal handling Signed-off-by: Denys Vlasenko --- miscutils/bc.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/miscutils/bc.c b/miscutils/bc.c index 15089314f..148e340a5 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -7121,7 +7121,23 @@ static BcStatus bc_vm_run(int argc, char *argv[], if (G.ttyin) { #if ENABLE_FEATURE_BC_SIGNALS - signal_no_SA_RESTART_empty_mask(SIGINT, record_signo); + // With SA_RESTART, most system calls will restart + // (IOW: they won't fail with EINTR). + // In particular, this means ^C won't cause + // stdout to get into "error state" if SIGINT hits + // within write() syscall. + // The downside is that ^C while line input is taken + // will only be handled after [Enter] since read() + // from stdin is not interrupted by ^C either, + // it restarts, thus fgetc() does not return on ^C. + signal_SA_RESTART_empty_mask(SIGINT, record_signo); + + // Without SA_RESTART, this exhibits a bug: + // "while (1) print 1" and try ^C-ing it. + // Intermittently, instead of returning to input line, + // you'll get "output error: Interrupted system call" + // and exit. + //signal_no_SA_RESTART_empty_mask(SIGINT, record_signo); #endif if (!(option_mask32 & BC_FLAG_Q)) bc_vm_info(); -- 2.25.1