sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit ea575b0d4cd58622fd43f2fa1f0b56a8b5abaed7
parent daabc24f0e13d74322f4825285600fe8dc4e81e4
Author: Wolfgang Corcoran-Mathe <first.lord.of.teal@gmail.com>
Date:   Fri Aug 28 00:10:02 -0400

tail: Don't print garbage when input contains no newlines.

getline(3) expects newline-terminated input. While glibc's
implementation seems to catch unterminated input and zero the
buffer, other versions (notably musl's) do not.

This is a workaround. Garbage will still be read, but
not printed.

Diffstat:
tail.c | 5+++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tail.c b/tail.c @@ -39,6 +39,7 @@ taketail(FILE *fp, const char *str, size_t n) Rune *r = NULL; char **ring = NULL; size_t i, j, *size = NULL; + int seenln = 0; if (!n) return; @@ -47,7 +48,7 @@ taketail(FILE *fp, const char *str, size_t n) ring = ecalloc(n, sizeof(*ring)); size = ecalloc(n, sizeof(*size)); - for (i = j = 0; getline(ring + i, size + i, fp) > 0; ) + for (i = j = 0; getline(ring + i, size + i, fp) > 0; seenln = 1) i = j = (i + 1) % n; } else { r = ecalloc(n, sizeof(*r)); @@ -59,7 +60,7 @@ taketail(FILE *fp, const char *str, size_t n) eprintf("%s: read error:", str); do { - if (ring && ring[j]) { + if (seenln && ring && ring[j]) { fputs(ring[j], stdout); free(ring[j]); } else if (r) {