From 7808b6981b2c7f828684148e2a65f9640958a59a Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 27 Mar 2014 07:06:02 +0200 Subject: [PATCH] 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. --- NEWS | 4 +++- src/buffer.c | 27 +++++++++++++++++---------- tests/iotty.at | 5 +++++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index fa24142..3f63ed7 100644 --- a/NEWS +++ b/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 @@ -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. diff --git a/src/buffer.c b/src/buffer.c index 248dd88..a7d8971 100644 --- a/src/buffer.c +++ b/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; diff --git a/tests/iotty.at b/tests/iotty.at index ea15c84..79589b7 100644 --- a/tests/iotty.at +++ b/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]) -- 2.43.0