mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-08 13:28:05 +00:00
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
This commit is contained in:
parent
0f4e803733
commit
5cb28f7979
@ -331,13 +331,24 @@ checkend(const char *ptr, const char *end, const char *msg)
|
|||||||
warnx("%s: %s: %s", infile, outfile, msg);
|
warnx("%s: %s: %s", infile, outfile, msg);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
if (fclose(outfp) != 0) {
|
|
||||||
warn("%s: %s", infile, outfile);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
checkout(int rval)
|
||||||
|
{
|
||||||
|
if (fflush(outfp) != 0) {
|
||||||
|
warn("%s: %s", infile, outfile);
|
||||||
|
rval = 1;
|
||||||
|
}
|
||||||
|
if (outfp != stdout) {
|
||||||
|
(void)fclose(outfp);
|
||||||
|
outfp = stdout;
|
||||||
|
}
|
||||||
|
outfile = "/dev/stdout";
|
||||||
|
return (rval);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
uu_decode(void)
|
uu_decode(void)
|
||||||
{
|
{
|
||||||
@ -349,9 +360,9 @@ uu_decode(void)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
switch (get_line(buf, sizeof(buf))) {
|
switch (get_line(buf, sizeof(buf))) {
|
||||||
case 0:
|
case 0:
|
||||||
return (0);
|
return (checkout(0));
|
||||||
case 1:
|
case 1:
|
||||||
return (1);
|
return (checkout(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEC(c) (((c) - ' ') & 077) /* single character decode */
|
#define DEC(c) (((c) - ' ') & 077) /* single character decode */
|
||||||
@ -408,11 +419,11 @@ uu_decode(void)
|
|||||||
}
|
}
|
||||||
switch (get_line(buf, sizeof(buf))) {
|
switch (get_line(buf, sizeof(buf))) {
|
||||||
case 0:
|
case 0:
|
||||||
return (0);
|
return (checkout(0));
|
||||||
case 1:
|
case 1:
|
||||||
return (1);
|
return (checkout(1));
|
||||||
default:
|
default:
|
||||||
return (checkend(buf, "end", "no \"end\" line"));
|
return (checkout(checkend(buf, "end", "no \"end\" line")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,9 +441,9 @@ base64_decode(void)
|
|||||||
switch (get_line(inbuf + strlen(inbuf),
|
switch (get_line(inbuf + strlen(inbuf),
|
||||||
sizeof(inbuf) - strlen(inbuf))) {
|
sizeof(inbuf) - strlen(inbuf))) {
|
||||||
case 0:
|
case 0:
|
||||||
return (0);
|
return (checkout(0));
|
||||||
case 1:
|
case 1:
|
||||||
return (1);
|
return (checkout(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
@ -459,7 +470,7 @@ base64_decode(void)
|
|||||||
break;
|
break;
|
||||||
fwrite(outbuf, 1, n, outfp);
|
fwrite(outbuf, 1, n, outfp);
|
||||||
}
|
}
|
||||||
return (checkend(inbuf, "====", "error decoding base64 input stream"));
|
return (checkout(checkend(inbuf, "====", "error decoding base64 input stream")));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -74,7 +74,7 @@ main_base64_encode(const char *in, const char *w)
|
|||||||
if (w != NULL)
|
if (w != NULL)
|
||||||
columns = arg_to_col(w);
|
columns = arg_to_col(w);
|
||||||
base64_encode();
|
base64_encode();
|
||||||
if (ferror(output))
|
if (fflush(output) != 0)
|
||||||
errx(1, "write error");
|
errx(1, "write error");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
@ -144,7 +144,7 @@ main_encode(int argc, char *argv[])
|
|||||||
base64_encode();
|
base64_encode();
|
||||||
else
|
else
|
||||||
encode();
|
encode();
|
||||||
if (ferror(output))
|
if (fflush(output) != 0)
|
||||||
errx(1, "write error");
|
errx(1, "write error");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user