X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Fbuffer.c;h=1a96595d9a982168d1da56f53863fdd6ee069f11;hp=95e8a26de1e42a5b2b922300c57dbd3e22db25f0;hb=1847ec67cec36a17354115374954fea211d1f0da;hpb=45ccda119355a1087450039a250359c1d0de0d08 diff --git a/src/buffer.c b/src/buffer.c index 95e8a26..1a96595 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -391,7 +391,10 @@ check_compressed_archive (bool *pshort) /* Restore global values */ read_full_records = sfr; - if (tar_checksum (record_start, true) == HEADER_SUCCESS) + if ((strcmp (record_start->header.magic, TMAGIC) == 0 || + strcmp (record_start->buffer + offsetof (struct posix_header, magic), + OLDGNU_MAGIC) == 0) && + tar_checksum (record_start, true) == HEADER_SUCCESS) /* Probably a valid header */ return ct_tar; @@ -668,6 +671,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,6 +707,7 @@ _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); read_full_records = read_full_records_option; @@ -731,7 +751,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,