Procházet zdrojové kódy

Refuse to write archive contents to a tty.

* NEWS: Update.
* src/buffer.c (_open_archive): Refuse to write to a tty.
* tests/iotty.at: Test output to a tty.
Sergey Poznyakoff před 11 roky
rodič
revize
7808b6981b
3 změnil soubory, kde provedl 25 přidání a 11 odebrání
  1. 3 1
      NEWS
  2. 17 10
      src/buffer.c
  3. 5 0
      tests/iotty.at

+ 3 - 1
NEWS

@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2014-02-21
+GNU tar NEWS - User visible changes. 2014-03-27
 Please send GNU tar bug reports to <[email protected]>
 
 
@@ -62,6 +62,8 @@ speed up archivation.
                           are: CVS, Git, Bazaar, Mercurial.
 			  
 
+* Tar refuses to read input from and write output to a tty device.
+
 * Manpages
 
 This release includes official tar(1) and rmt(8) manpages.

+ 17 - 10
src/buffer.c

@@ -668,6 +668,22 @@ init_buffer (void)
   record_end = record_start + blocking_factor;
 }
 
+static void
+check_tty (enum access_mode mode)
+{
+  /* Refuse to read archive from and write it to a tty. */
+  if (strcmp (archive_name_array[0], "-") == 0
+      && isatty (mode == ACCESS_READ ? STDIN_FILENO : STDOUT_FILENO))
+    {
+      FATAL_ERROR ((0, 0,
+		    mode == ACCESS_READ
+		    ? _("Refusing to read archive contents from terminal "
+			"(missing -f option?)")
+		    : _("Refusing to write archive contents to terminal "
+			"(missing -f option?)")));
+    }
+}
+
 /* Open an archive file.  The argument specifies whether we are
    reading or writing, or both.  */
 static void
@@ -688,17 +704,8 @@ _open_archive (enum access_mode wanted_access)
 
   /* When updating the archive, we start with reading.  */
   access_mode = wanted_access == ACCESS_UPDATE ? ACCESS_READ : wanted_access;
+  check_tty (access_mode);
 
-  /* Refuse to read archive from a tty.
-     Do not fail if the tar's output goes directly to tty because such
-     behavior would go against GNU Coding Standards:
-     http://lists.gnu.org/archive/html/bug-tar/2014-03/msg00042.html */
-  if (strcmp (archive_name_array[0], "-") == 0
-      && wanted_access == ACCESS_READ && isatty (STDIN_FILENO))
-    FATAL_ERROR ((0, 0,
-                  _("Refusing to read archive contents from terminal "
-                    "(missing -f option?)")));
-  
   read_full_records = read_full_records_option;
 
   records_read = 0;

+ 5 - 0
tests/iotty.at

@@ -33,6 +33,8 @@ ttyemu -t5 -i/dev/null tar -x
 echo $?
 ttyemu -t5 -i/dev/null tar -xz
 echo $?
+ttyemu -t5 -i/dev/null tar -c .
+echo $?
 ],
 [0],
 [tar: Refusing to read archive contents from terminal (missing -f option?)
@@ -41,6 +43,9 @@ tar: Error is not recoverable: exiting now
 tar: Refusing to read archive contents from terminal (missing -f option?)
 tar: Error is not recoverable: exiting now
 2
+tar: Refusing to write archive contents to terminal (missing -f option?)
+tar: Error is not recoverable: exiting now
+2
 ],
 [],[],[],[posix, gnu, oldgnu])