Переглянути джерело

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.
Sergey Poznyakoff 4 роки тому
батько
коміт
e4d1edadef
2 змінених файлів з 14 додано та 4 видалено
  1. 10 3
      lib/stdopen.c
  2. 4 1
      src/tar.c

+ 10 - 3
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)
                 {

+ 4 - 1
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.  */