]> Dogcows Code - chaz/tar/blobdiff - src/tar.c
tar: more reliable directory traversal when creating archives
[chaz/tar] / src / tar.c
index dcc3116257609943fbac6a6cdc1298f923ee3927..ab53cec684295d6c80f492dbd89de09bdf5f83fa 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -74,7 +74,7 @@
 static const char *stdin_used_by;
 
 /* Doesn't return if stdin already requested.  */
-void
+static void
 request_stdin (const char *option)
 {
   if (stdin_used_by)
@@ -2465,6 +2465,14 @@ decode_options (int argc, char **argv)
   if (recursive_unlink_option)
     old_files_option = UNLINK_FIRST_OLD_FILES;
 
+  /* Flags for accessing files to be copied into.  POSIX says
+     O_NONBLOCK has unspecified effect on most types of files, but in
+     practice it never harms and sometimes helps.  */
+  open_read_flags =
+    (O_RDONLY | O_BINARY | O_NOCTTY | O_NONBLOCK
+     | (dereference_option ? 0 : O_NOFOLLOW)
+     | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
+  fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
 
   if (subcommand_option == TEST_LABEL_SUBCOMMAND)
     {
@@ -2494,8 +2502,8 @@ decode_options (int argc, char **argv)
                      _("Cowardly refusing to create an empty archive")));
       if (args.compress_autodetect && archive_names
          && strcmp (archive_name_array[0], "-"))
-       set_comression_program_by_suffix (archive_name_array[0],
-                                         use_compress_program_option);
+       set_compression_program_by_suffix (archive_name_array[0],
+                                          use_compress_program_option);
       break;
 
     case EXTRACT_SUBCOMMAND:
@@ -2686,6 +2694,8 @@ tar_stat_destroy (struct tar_stat_info *st)
   free (st->gname);
   free (st->sparse_map);
   free (st->dumpdir);
+  if (0 < st->fd)
+    close (st->fd);
   xheader_destroy (&st->xhdr);
   memset (st, 0, sizeof (*st));
 }
This page took 0.023509 seconds and 4 git commands to generate.