From 5085fe5d56e63f23f9812bd120a8453bd6589edc Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Wed, 8 Nov 2023 15:21:25 +0000 Subject: iconv: fix incorrect fix Part of commit 412c2cab62 (iconv: minor fixes) was intended to avoid having to enter ^Z twice to signal EOF when input was coming from the console. Unfortunately there were unintended consequences. Use a different method to detect EOF. Costs 32-48 bytes. (GitHuv issue #374) --- miscutils/iconv.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/miscutils/iconv.c b/miscutils/iconv.c index debb45704..bedbb718d 100644 --- a/miscutils/iconv.c +++ b/miscutils/iconv.c @@ -1677,25 +1677,26 @@ static void process_file(iconv_t cd, FILE *in, FILE *out) char outbuf[BUFSIZ]; const char *pin; char *pout; - size_t inbytesleft = 0; + size_t inbytesleft; size_t outbytesleft; size_t rest = 0; size_t r; - while ((!feof(in) && - (inbytesleft=fread(inbuf+rest, 1, sizeof(inbuf)-rest, in)) != 0) + while ((inbytesleft=fread(inbuf+rest, 1, sizeof(inbuf)-rest, in)) != 0 || rest != 0) { inbytesleft += rest; pin = inbuf; pout = outbuf; outbytesleft = sizeof(outbuf); r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); + fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out); if (r == (size_t)(-1) && errno != E2BIG && (errno != EINVAL || feof(in))) bb_perror_msg_and_die("conversion error"); - fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out); memmove(inbuf, pin, inbytesleft); rest = inbytesleft; + if (rest == 0 && feof(in)) + break; } pout = outbuf; outbytesleft = sizeof(outbuf); -- cgit v1.2.3-55-g6feb