]> Dogcows Code - chaz/tar/blobdiff - src/extract.c
tar: fix -x --overwrite bug (no --dereference, ! O_NOFOLLOW)
[chaz/tar] / src / extract.c
index 98236acad29b03260f9df7466edc25dc1d8cc13f..44233b9efdddbd51f123385418cbfe5d6270a0e5 100644 (file)
@@ -864,6 +864,20 @@ open_output_file (char const *file_name, int typeflag, mode_t mode,
        }
     }
 
+  /* If O_NOFOLLOW is needed but does not work, check for a symlink
+     separately.  There's a race condition, but that cannot be avoided
+     on hosts lacking O_NOFOLLOW.  */
+  if (! O_NOFOLLOW && overwriting_old_files && ! dereference_option)
+    {
+      struct stat st;
+      if (fstatat (chdir_fd, file_name, &st, AT_SYMLINK_NOFOLLOW) == 0
+         && S_ISLNK (st.st_mode))
+       {
+         errno = ELOOP;
+         return -1;
+       }
+    }
+
   fd = openat (chdir_fd, file_name, openflag, mode);
   if (0 <= fd)
     {
This page took 0.020787 seconds and 4 git commands to generate.