summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2014-03-20 16:28:25 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2014-03-20 19:46:30 +0200
commitb0902369e789c9aadf584799889a34637688d601 (patch)
tree0b7e8b02e913f6a5c5a703d1e1e0ee882568a3d9 /src/buffer.c
parentda546e69afb2120a4c8a61ecadb5a66bf56cfa5d (diff)
downloadtar-b0902369e789c9aadf584799889a34637688d601.tar.gz
Fail if archive comes from a terminal.
Based on patch from Pavel Raiskup <praiskup@redhat.com>. * gnulib.modules: Add new modules. * src/buffer.c (_open_archive): Refuse to read archive from a tty. * tests/Makefile.am (TESTSUITE_AT): Add iotty.at (check_PROGRAMS): New program ttyemu * tests/testsuite.at: Include iotty.at * tests/iotty.at: New file. * tests/ttyemu.c: New file.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 95e8a26d..248dd880 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -689,6 +689,16 @@ _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;
+ /* 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;
@@ -731,7 +741,6 @@ _open_archive (enum access_mode wanted_access)
enum compress_type type;
archive = STDIN_FILENO;
-
type = check_compressed_archive (&shortfile);
if (type != ct_tar && type != ct_none)
FATAL_ERROR ((0, 0,