From a2222839a574d4744cb3b23916c55a1ffc398b87 Mon Sep 17 00:00:00 2001 From: "Tim J. Robbins" Date: Fri, 5 Nov 2004 10:45:23 +0000 Subject: [PATCH] When the last line of a file is missing a newline in -f mode, pass a length argument to mbrtowc() that accounts for the terminating newline character we add automatically. Failing to do this caused the loop to unexpectedly run out of characters and incorrectly signal an "Illegal byte sequence" error. --- usr.bin/cut/cut.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/usr.bin/cut/cut.c b/usr.bin/cut/cut.c index 2e334f6e250..a370e600ef0 100644 --- a/usr.bin/cut/cut.c +++ b/usr.bin/cut/cut.c @@ -371,10 +371,11 @@ f_cut(FILE *fp, const char *fname) wchar_t sep; int output; char *lbuf, *mlbuf; - size_t clen, lbuflen; + size_t clen, lbuflen, reallen; mlbuf = NULL; for (sep = dchar; (lbuf = fgetln(fp, &lbuflen)) != NULL;) { + reallen = lbuflen; /* Assert EOL has a newline. */ if (*(lbuf + lbuflen - 1) != '\n') { /* Can't have > 1 line with no trailing newline. */ @@ -384,10 +385,11 @@ f_cut(FILE *fp, const char *fname) memcpy(mlbuf, lbuf, lbuflen); *(mlbuf + lbuflen) = '\n'; lbuf = mlbuf; + reallen++; } output = 0; for (isdelim = 0, p = lbuf;; p += clen) { - clen = mbrtowc(&ch, p, lbuf + lbuflen - p, NULL); + clen = mbrtowc(&ch, p, lbuf + reallen - p, NULL); if (clen == (size_t)-1 || clen == (size_t)-2) { warnc(EILSEQ, "%s", fname); free(mlbuf); @@ -413,7 +415,7 @@ f_cut(FILE *fp, const char *fname) for (i = 0; dcharmb[i] != '\0'; i++) putchar(dcharmb[i]); for (;;) { - clen = mbrtowc(&ch, p, lbuf + lbuflen - p, + clen = mbrtowc(&ch, p, lbuf + reallen - p, NULL); if (clen == (size_t)-1 || clen == (size_t)-2) { warnc(EILSEQ, "%s", fname); -- 2.45.0