From dfac36b6c3d72ac3732ec2c638b8bae16d1a01ae Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 26 Mar 2013 14:14:08 +0000 Subject: [PATCH] Only accept partial keys if the timer has not expired, fixes infinite loop when Escape is pressed the wrong number of times. --- tty-keys.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tty-keys.c b/tty-keys.c index 33539d15..26edbf32 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -448,7 +448,7 @@ tty_keys_next(struct tty *tty) const char *buf; size_t len, size; cc_t bspace; - int key, delay; + int key, delay, expired = 0; /* Get key buffer. */ buf = EVBUFFER_DATA(tty->event->input); @@ -508,7 +508,7 @@ first_key: } tk = tty_keys_find(tty, buf + 1, len - 1, &size); - if (tk != NULL) { + if (tk != NULL && (!expired || tk->next == NULL)) { size++; /* include escape */ if (tk->next != NULL) goto partial_key; @@ -540,8 +540,10 @@ partial_key: /* If timer is going, check for expiration. */ if (tty->flags & TTY_TIMER) { if (evtimer_initialized(&tty->key_timer) && - !evtimer_pending(&tty->key_timer, NULL)) + !evtimer_pending(&tty->key_timer, NULL)) { + expired = 1; goto first_key; + } return (0); }