git: fa778f0ce5ef - stable/14 - bintrans: Error out if writing to the output failed.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 24 Feb 2024 12:14:59 UTC
The branch stable/14 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=fa778f0ce5ef2bee0ce288a7c8eef9a88ddda8be commit fa778f0ce5ef2bee0ce288a7c8eef9a88ddda8be Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2024-02-01 13:10:31 +0000 Commit: Dag-Erling Smørgrav <des@FreeBSD.org> CommitDate: 2024-02-24 12:12:49 +0000 bintrans: Error out if writing to the output failed. - Cover all code paths. - When decoding, check all output files, not just the last one. - A simple `ferror()` check is not enough as an error may later occur while flushing whatever remains in the output buffer. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: allanjude Differential Revision: https://reviews.freebsd.org/D43532 (cherry picked from commit 5cb28f7979773715615cc2131fe40e0c5879ed1d) bintrans: Fix uninitialized variable. `prev` may be used uninitialized if `body` starts with a newline. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: bapt, emaste Differential Revision: https://reviews.freebsd.org/D43534 (cherry picked from commit bce34cba07bcfed9cd519a658e594c9910c8f210) bintrans: Add base64 to name list in manual page. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: 0mp, pstef Differential Revision: https://reviews.freebsd.org/D43558 (cherry picked from commit 64028ac3ba9668cff31bfe2c79d85a3b89e10953) bintrans: Remove unused variable. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: allanjude Differential Revision: https://reviews.freebsd.org/D43559 (cherry picked from commit bc2913d1736c2b299a265741a779014d001bd108) --- usr.bin/bintrans/bintrans.1 | 9 ++++----- usr.bin/bintrans/qp.c | 5 ++--- usr.bin/bintrans/uudecode.c | 33 ++++++++++++++++++++++----------- usr.bin/bintrans/uuencode.c | 4 ++-- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/usr.bin/bintrans/bintrans.1 b/usr.bin/bintrans/bintrans.1 index e7e7f4c56cdf..16ae66aa21d1 100644 --- a/usr.bin/bintrans/bintrans.1 +++ b/usr.bin/bintrans/bintrans.1 @@ -25,9 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" From: @(#)uuencode.1 8.1 (Berkeley) 6/6/93 -.\" -.Dd April 18, 2022 +.Dd January 23, 2024 .Dt BINTRANS 1 .Os .Sh NAME @@ -35,8 +33,9 @@ .Nm uuencode , .Nm uudecode , .Nm b64encode , -.Nm b64decode -.Nd encode/decode a binary file +.Nm b64decode , +.Nm base64 +.Nd encode / decode a binary file .Sh SYNOPSIS .Nm .Op algorithm diff --git a/usr.bin/bintrans/qp.c b/usr.bin/bintrans/qp.c index 74fa1ec3ae90..c2c9dfa7a224 100644 --- a/usr.bin/bintrans/qp.c +++ b/usr.bin/bintrans/qp.c @@ -90,9 +90,9 @@ decode_quoted_printable(const char *body, FILE *fpo) static void encode_quoted_printable(const char *body, FILE *fpo) { - char prev; const char *end = body + strlen(body); size_t linelen = 0; + char prev = '\0'; while (*body != '\0') { if (linelen == 75) { @@ -138,12 +138,11 @@ qp(FILE *fp, FILE *fpo, bool encode) { char *line = NULL; size_t linecap = 0; - ssize_t linelen; void (*codec)(const char *line, FILE *f); codec = encode ? encode_quoted_printable : decode_quoted_printable ; - while ((linelen = getline(&line, &linecap, fp)) > 0) + while (getline(&line, &linecap, fp) > 0) codec(line, fpo); free(line); } diff --git a/usr.bin/bintrans/uudecode.c b/usr.bin/bintrans/uudecode.c index b0ab415486c8..6f716b0f2ec1 100644 --- a/usr.bin/bintrans/uudecode.c +++ b/usr.bin/bintrans/uudecode.c @@ -343,11 +343,22 @@ checkend(const char *ptr, const char *end, const char *msg) warnx("%s: %s: %s", infile, outfile, msg); return (1); } - if (fclose(outfp) != 0) { + return (0); +} + +static int +checkout(int rval) +{ + if (fflush(outfp) != 0) { warn("%s: %s", infile, outfile); - return (1); + rval = 1; } - return (0); + if (outfp != stdout) { + (void)fclose(outfp); + outfp = stdout; + } + outfile = "/dev/stdout"; + return (rval); } static int @@ -361,9 +372,9 @@ uu_decode(void) for (;;) { switch (get_line(buf, sizeof(buf))) { case 0: - return (0); + return (checkout(0)); case 1: - return (1); + return (checkout(1)); } #define DEC(c) (((c) - ' ') & 077) /* single character decode */ @@ -420,11 +431,11 @@ uu_decode(void) } switch (get_line(buf, sizeof(buf))) { case 0: - return (0); + return (checkout(0)); case 1: - return (1); + return (checkout(1)); default: - return (checkend(buf, "end", "no \"end\" line")); + return (checkout(checkend(buf, "end", "no \"end\" line"))); } } @@ -442,9 +453,9 @@ base64_decode(void) switch (get_line(inbuf + strlen(inbuf), sizeof(inbuf) - strlen(inbuf))) { case 0: - return (0); + return (checkout(0)); case 1: - return (1); + return (checkout(1)); } count = 0; @@ -471,7 +482,7 @@ base64_decode(void) break; fwrite(outbuf, 1, n, outfp); } - return (checkend(inbuf, "====", "error decoding base64 input stream")); + return (checkout(checkend(inbuf, "====", "error decoding base64 input stream"))); } static void diff --git a/usr.bin/bintrans/uuencode.c b/usr.bin/bintrans/uuencode.c index 267ab7deb8d1..d6a377fcabae 100644 --- a/usr.bin/bintrans/uuencode.c +++ b/usr.bin/bintrans/uuencode.c @@ -86,7 +86,7 @@ main_base64_encode(const char *in, const char *w) if (w != NULL) columns = arg_to_col(w); base64_encode(); - if (ferror(output)) + if (fflush(output) != 0) errx(1, "write error"); exit(0); } @@ -156,7 +156,7 @@ main_encode(int argc, char *argv[]) base64_encode(); else encode(); - if (ferror(output)) + if (fflush(output) != 0) errx(1, "write error"); exit(0); }