[PATCH] tools: kwboot: Fix detection of quit esc sequence

Quit esc sequence may be also in the middle of the read buffer. Fix the detection for that case.
Signed-off-by: Pali Rohár pali@kernel.org --- tools/kwboot.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/tools/kwboot.c b/tools/kwboot.c index 2684f0e75a56..7737188f0d0a 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -1183,10 +1183,10 @@ kwboot_xmodem(int tty, const void *_img, size_t size, int baudrate) static int kwboot_term_pipe(int in, int out, const char *quit, int *s) { + char buf[128]; ssize_t nin; - char _buf[128], *buf = _buf;
- nin = read(in, buf, sizeof(_buf)); + nin = read(in, buf, sizeof(buf)); if (nin <= 0) return -1;
@@ -1194,18 +1194,21 @@ kwboot_term_pipe(int in, int out, const char *quit, int *s) int i;
for (i = 0; i < nin; i++) { - if (*buf == quit[*s]) { + if (buf[i] == quit[*s]) { (*s)++; - if (!quit[*s]) - return 0; - buf++; - nin--; + if (!quit[*s]) { + nin = i - *s; + break; + } } else { - if (kwboot_write(out, quit, *s) < 0) + if (*s > i && kwboot_write(out, quit, *s - i) < 0) return -1; *s = 0; } } + + if (i == nin) + nin -= *s; }
if (kwboot_write(out, buf, nin) < 0)

On 2/3/22 17:45, Pali Rohár wrote:
Quit esc sequence may be also in the middle of the read buffer. Fix the detection for that case.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
tools/kwboot.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/tools/kwboot.c b/tools/kwboot.c index 2684f0e75a56..7737188f0d0a 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -1183,10 +1183,10 @@ kwboot_xmodem(int tty, const void *_img, size_t size, int baudrate) static int kwboot_term_pipe(int in, int out, const char *quit, int *s) {
- char buf[128]; ssize_t nin;
char _buf[128], *buf = _buf;
nin = read(in, buf, sizeof(_buf));
- nin = read(in, buf, sizeof(buf)); if (nin <= 0) return -1;
@@ -1194,18 +1194,21 @@ kwboot_term_pipe(int in, int out, const char *quit, int *s) int i;
for (i = 0; i < nin; i++) {
if (*buf == quit[*s]) {
if (buf[i] == quit[*s]) { (*s)++;
if (!quit[*s])
return 0;
buf++;
nin--;
if (!quit[*s]) {
nin = i - *s;
break;
} } else {
if (kwboot_write(out, quit, *s) < 0)
if (*s > i && kwboot_write(out, quit, *s - i) < 0) return -1; *s = 0; }
}
if (i == nin)
nin -= *s;
}
if (kwboot_write(out, buf, nin) < 0)
Viele Grüße, Stefan Roese

On 2/3/22 17:45, Pali Rohár wrote:
Quit esc sequence may be also in the middle of the read buffer. Fix the detection for that case.
Signed-off-by: Pali Rohár pali@kernel.org
Applied to u-boot-marvell/master
Thanks, Stefan
tools/kwboot.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/tools/kwboot.c b/tools/kwboot.c index 2684f0e75a56..7737188f0d0a 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -1183,10 +1183,10 @@ kwboot_xmodem(int tty, const void *_img, size_t size, int baudrate) static int kwboot_term_pipe(int in, int out, const char *quit, int *s) {
- char buf[128]; ssize_t nin;
char _buf[128], *buf = _buf;
nin = read(in, buf, sizeof(_buf));
- nin = read(in, buf, sizeof(buf)); if (nin <= 0) return -1;
@@ -1194,18 +1194,21 @@ kwboot_term_pipe(int in, int out, const char *quit, int *s) int i;
for (i = 0; i < nin; i++) {
if (*buf == quit[*s]) {
if (buf[i] == quit[*s]) { (*s)++;
if (!quit[*s])
return 0;
buf++;
nin--;
if (!quit[*s]) {
nin = i - *s;
break;
} } else {
if (kwboot_write(out, quit, *s) < 0)
if (*s > i && kwboot_write(out, quit, *s - i) < 0) return -1; *s = 0; }
}
if (i == nin)
nin -= *s;
}
if (kwboot_write(out, buf, nin) < 0)
Viele Grüße, Stefan Roese
participants (2)
-
Pali Rohár
-
Stefan Roese