]> Dogcows Code - chaz/tar/blobdiff - src/extract.c
tar: if (p) free (p); -> free (p);
[chaz/tar] / src / extract.c
index 44233b9efdddbd51f123385418cbfe5d6270a0e5..aaea56ed3abcfcfb2bfde356715f6133e22e4fae 100644 (file)
@@ -609,6 +609,18 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
   switch (e)
     {
     case ELOOP:
+
+      /* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
+        but some operating systems do not conform to the standard.  */
+#ifdef EFTYPE
+      /* NetBSD uses errno == EFTYPE; see <http://gnats.netbsd.org/43154>.  */
+    case EFTYPE:
+#endif
+      /* FreeBSD 8.1 uses errno == EMLINK.  */
+    case EMLINK:
+      /* Tru64 5.1B uses errno == ENOTSUP.  */
+    case ENOTSUP:
+
       if (! regular
          || old_files_option != OVERWRITE_OLD_FILES || dereference_option)
        break;
@@ -1205,7 +1217,7 @@ static int
 extract_node (char *file_name, int typeflag)
 {
   bool interdir_made = false;
-  mode_t mode = (current_stat_info.stat.st_mode & MODE_RWX
+  mode_t mode = (current_stat_info.stat.st_mode & (MODE_RWX | S_IFBLK | S_IFCHR)
                 & ~ (0 < same_owner_option ? S_IRWXG | S_IRWXO : 0));
 
   while (mknodat (chdir_fd, file_name, mode, current_stat_info.stat.st_rdev)
This page took 0.02765 seconds and 4 git commands to generate.