From: Sergey Poznyakoff Date: Fri, 8 Jan 2021 15:34:19 +0000 (+0200) Subject: Actually prefer /dev/full over /dev/null as a replacement for stdin X-Git-Tag: release_1_34~9 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=e4d1edadefdeefcca3b72ec32744c52020fe4642;p=thirdparty%2Ftar.git Actually prefer /dev/full over /dev/null as a replacement for stdin * lib/stdopen.c (stdopen): Fix improper condition. Avoid leaking extra file descriptor. * src/tar.c (main): Set name of the stdout for diagnostics. Bail out if stdopen fails. --- diff --git a/lib/stdopen.c b/lib/stdopen.c index d9775727..8c891168 100644 --- a/lib/stdopen.c +++ b/lib/stdopen.c @@ -52,15 +52,22 @@ stdopen (void) static const int contrary_mode[] = { O_WRONLY, O_RDONLY, O_RDONLY }; int mode = contrary_mode[fd]; - int new_fd; + int new_fd = -1; /* Open /dev/null with the contrary mode so that the typical read (stdin) or write (stdout, stderr) operation will fail. With descriptor 0, we can do even better on systems that have /dev/full, by opening that write-only instead of /dev/null. The only drawback is that a write-provoked failure comes with a misleading errno value, ENOSPC. */ - if (mode == O_RDONLY - || (new_fd = open ("/dev/full", mode) != fd)) + if (mode == O_WRONLY) + { + if ((new_fd = open ("/dev/full", mode)) != fd) + { + close (new_fd); + new_fd = -1; + } + } + if (new_fd == -1) new_fd = open ("/dev/null", mode); if (new_fd != fd) { diff --git a/src/tar.c b/src/tar.c index 728e38bc..61d77c3d 100644 --- a/src/tar.c +++ b/src/tar.c @@ -2751,8 +2751,11 @@ main (int argc, char **argv) set_quoting_style (0, DEFAULT_QUOTING_STYLE); + close_stdout_set_file_name (_("stdout")); /* Make sure we have first three descriptors available */ - stdopen (); + if (!stdopen ()) + FATAL_ERROR ((0, errno, "%s", + _("failed to ensure first three descriptors are available"))); /* Pre-allocate a few structures. */