path: root/common/hush.c
diff options
authorSascha Hauer <>2019-02-25 09:03:30 +0100
committerSascha Hauer <>2019-04-24 09:37:12 +0200
commitc5f991d2ad8ea2d872fad64dee2fd660bb0a1b20 (patch)
tree8480b1d96613251b08e40702a2b576a3d392577b /common/hush.c
parentea569a0afd6a2e9a84418cd18ddeaeefaa5eae39 (diff)
Shell: Handle aborting loops better
It's easy to get stuck in an infinite loop in the hush shell: while true; do sleep 1; done The 'sleep' command will check for ctrl-c with the ctrlc() function. This will abort the sleep command. Hush then checks for ctrl-c again in the loop. The ctrl-c in the buffer has already been eaten by the sleep command, so the loop will continue. With this patch we remember the presence of a ctrl-c character in a variable instead of checking for a new character each time. The variable must be resetted explicitly by calling ctrlc_handled() which will be called by the shell in the outer loop. Signed-off-by: Sascha Hauer <>
Diffstat (limited to 'common/hush.c')
1 files changed, 2 insertions, 1 deletions
diff --git a/common/hush.c b/common/hush.c
index d2f9cc7..dab9b04 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -1734,7 +1734,7 @@ static int parse_stream_outer(struct p_context *ctx, struct in_str *inp, int fla
return 1;
- } while (rcode != -1 && !(flag & FLAG_EXIT_FROM_LOOP)); /* loop on syntax errors, return on EOF */
+ } while (!ctrlc() && rcode != -1 && !(flag & FLAG_EXIT_FROM_LOOP)); /* loop on syntax errors, return on EOF */
return code;
@@ -1932,6 +1932,7 @@ int run_shell(void)
do {
+ ctrlc_handled();
rcode = parse_stream_outer(&ctx, &input, FLAG_PARSE_SEMICOLON);
if (rcode < -1) {