From 3cc6da022bf92f43e710bde0aa7e4622f543faa8 Mon Sep 17 00:00:00 2001 From: Libor Peltan Date: Wed, 9 Apr 2025 10:10:26 +0200 Subject: [PATCH] zscanner: bugfix: buffering from pipe --- src/libzscanner/scanner.c.g2 | 8 ++++++-- src/libzscanner/scanner.c.t0 | 8 ++++++-- src/libzscanner/scanner.rl | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/libzscanner/scanner.c.g2 b/src/libzscanner/scanner.c.g2 index 5c376e373..060999ff1 100644 --- a/src/libzscanner/scanner.c.g2 +++ b/src/libzscanner/scanner.c.g2 @@ -227,8 +227,12 @@ static char *read_file_to_buf( char *buf = malloc(bufs + newbufs); int ret = 0; - while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) == newbufs) { - bufs += newbufs; + while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) > 0) { + bufs += ret; + if (ret < newbufs) { + newbufs -= ret; + continue; + } newbufs = bufs; char *newbuf = realloc(buf, bufs + newbufs); if (newbuf == NULL) { diff --git a/src/libzscanner/scanner.c.t0 b/src/libzscanner/scanner.c.t0 index 1dd561867..48c6bdf12 100644 --- a/src/libzscanner/scanner.c.t0 +++ b/src/libzscanner/scanner.c.t0 @@ -6622,8 +6622,12 @@ static char *read_file_to_buf( char *buf = malloc(bufs + newbufs); int ret = 0; - while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) == newbufs) { - bufs += newbufs; + while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) > 0) { + bufs += ret; + if (ret < newbufs) { + newbufs -= ret; + continue; + } newbufs = bufs; char *newbuf = realloc(buf, bufs + newbufs); if (newbuf == NULL) { diff --git a/src/libzscanner/scanner.rl b/src/libzscanner/scanner.rl index 7f5d984db..badec642c 100644 --- a/src/libzscanner/scanner.rl +++ b/src/libzscanner/scanner.rl @@ -228,8 +228,12 @@ static char *read_file_to_buf( char *buf = malloc(bufs + newbufs); int ret = 0; - while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) == newbufs) { - bufs += newbufs; + while (buf != NULL && (ret = read(fd, buf + bufs, newbufs)) > 0) { + bufs += ret; + if (ret < newbufs) { + newbufs -= ret; + continue; + } newbufs = bufs; char *newbuf = realloc(buf, bufs + newbufs); if (newbuf == NULL) {