This fixes a problem where the contents of the previous line were output
when the previous line was long enough to cause buf to be extended.
The buffer is re-used/rewritten for each line, instead of appending to it.
---
 util-linux/rev.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/util-linux/rev.c b/util-linux/rev.c
index d439b4da8..53b6b91aa 100644
--- a/util-linux/rev.c
+++ b/util-linux/rev.c
@@ -78,20 +78,21 @@ int rev_main(int argc UNUSED_PARAM, char **argv)
                pos = 0;
                while (1) {
                        /* Read one line */
-                       buf[bufsize - 1] = 1; /* not 0 */
-                       if (!fgets(buf + pos, bufsize - pos, fp))
+                       if (!fgets(buf, bufsize, fp))
                                break; /* EOF/error */
-                       if (buf[bufsize - 1] == '\0' /* fgets filled entire 
buffer */
-                        && buf[bufsize - 2] != '\n' /* and did not read '\n' */
+                       int len = strlen(buf);
+                       while (buf[len - 1] != '\n' /* fgets filled entire 
buffer */
                         && !feof(fp)
                        ) {
                                /* Line is too long, extend buffer */
                                pos = bufsize - 1;
                                bufsize += 64 + bufsize / 8;
                                buf = xrealloc(buf, bufsize);
-                               continue;
+                               /* Fill remaining buffer */
+                               if (!fgets(buf + pos, bufsize - pos, fp))
+                                       break;
+                               len = strlen(buf);
                        }
-
                        /* Process and print it */
 #if ENABLE_UNICODE_SUPPORT
                        {
-- 
2.32.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to