commit 438d2542e4bb731c65d10f908cd0519cf502750c
parent 1fa942a0ee2a6c02d3c48ae385b828682348c5d1
Author: Wolfgang Corcoran-Mathe <first.lord.of.teal@gmail.com>
Date: Fri, 28 Aug 2015 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:
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) {