From b46f4689bd0acc182c3f302182932456f5448180 Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Tue, 15 Jul 2025 16:05:00 +0200 Subject: [PATCH] fix(linenoise): Read escape sequences one character at a time --- components/console/linenoise/linenoise.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/console/linenoise/linenoise.c b/components/console/linenoise/linenoise.c index c41d76b2ec..4e051cf6a8 100644 --- a/components/console/linenoise/linenoise.c +++ b/components/console/linenoise/linenoise.c @@ -1022,11 +1022,15 @@ static int linenoiseEdit(char *buf, size_t buflen, const char *prompt) case ESC: { /* escape sequence */ /* ESC [ sequences. */ char seq[3]; - int r = read_func(in_fd, seq, 2); - if (r != 2) { + int r = read_func(in_fd, seq, 1); + if (r != 1) { return -1; } if (seq[0] == '[') { + int r = read_func(in_fd, seq + 1, 1); + if (r != 1) { + return -1; + } if (seq[1] >= '0' && seq[1] <= '9') { /* Extended escape, read additional byte. */ r = read_func(in_fd, seq + 2, 1); @@ -1065,6 +1069,10 @@ static int linenoiseEdit(char *buf, size_t buflen, const char *prompt) } /* ESC O sequences. */ else if (seq[0] == 'O') { + int r = read_func(in_fd, seq + 1, 1); + if (r != 1) { + return -1; + } switch(seq[1]) { case 'H': /* Home */ linenoiseEditMoveHome(&l);