pkubat / rpms / cpio

Forked from rpms/cpio 4 years ago
Clone
Radek Brich e98db37
--- cpio-2.9/src/copypass.c.chmodRaceC	2007-06-28 14:10:01.000000000 +0200
Radek Brich e98db37
+++ cpio-2.9/src/copypass.c	2007-07-19 10:43:26.000000000 +0200
Radek Brich e98db37
@@ -239,15 +239,23 @@ process_copy_pass ()
Radek Brich e98db37
 		  cdf_flag = 1;
Radek Brich e98db37
 		}
Radek Brich e98db37
 #endif
Radek Brich e98db37
-	      res = mkdir (output_name.ds_string, in_file_stat.st_mode);
Radek Brich e98db37
+	      res = mkdir (output_name.ds_string, in_file_stat.st_mode & ~077);
Radek Brich e98db37
 
Radek Brich e98db37
 	    }
Radek Brich e98db37
 	  else
Radek Brich e98db37
-	    res = 0;
Radek Brich e98db37
+            {
Radek Brich e98db37
+              if (!no_chown_flag && (out_file_stat.st_mode & 077) != 0
Radek Brich e98db37
+                  && chmod (output_name.ds_string, out_file_stat.st_mode & 07700) < 0)
Radek Brich e98db37
+                {
Radek Brich e98db37
+                  error (0, errno, "%s: chmod", output_name.ds_string);
Radek Brich e98db37
+                  continue;
Radek Brich e98db37
+                }
Radek Brich e98db37
+              res = 0;
Radek Brich e98db37
+            }
Radek Brich e98db37
 	  if (res < 0 && create_dir_flag)
Radek Brich e98db37
 	    {
Radek Brich e98db37
 	      create_all_directories (output_name.ds_string);
Radek Brich e98db37
-	      res = mkdir (output_name.ds_string, in_file_stat.st_mode);
Radek Brich e98db37
+	      res = mkdir (output_name.ds_string, in_file_stat.st_mode & ~077);
Radek Brich e98db37
 	    }
Radek Brich e98db37
 	  if (res < 0)
Radek Brich e98db37
 	    {
Radek Brich e98db37
@@ -290,12 +298,12 @@ process_copy_pass ()
Radek Brich e98db37
 
Radek Brich e98db37
 	  if (link_res < 0)
Radek Brich e98db37
 	    {
Radek Brich e98db37
-	      res = mknod (output_name.ds_string, in_file_stat.st_mode,
Radek Brich e98db37
+	      res = mknod (output_name.ds_string, in_file_stat.st_mode & ~077,
Radek Brich e98db37
 			   in_file_stat.st_rdev);
Radek Brich e98db37
 	      if (res < 0 && create_dir_flag)
Radek Brich e98db37
 		{
Radek Brich e98db37
 		  create_all_directories (output_name.ds_string);
Radek Brich e98db37
-		  res = mknod (output_name.ds_string, in_file_stat.st_mode,
Radek Brich e98db37
+		  res = mknod (output_name.ds_string, in_file_stat.st_mode & ~077,
Radek Brich e98db37
 			       in_file_stat.st_rdev);
Radek Brich e98db37
 		}
Radek Brich e98db37
 	      if (res < 0)
Radek Brich e98db37
--- cpio-2.9/src/copyin.c.chmodRaceC	2007-06-28 12:51:09.000000000 +0200
Radek Brich e98db37
+++ cpio-2.9/src/copyin.c	2007-07-19 10:37:50.000000000 +0200
Radek Brich e98db37
@@ -186,11 +186,12 @@ list_file(struct cpio_file_stat* file_hd
Radek Brich e98db37
 
Radek Brich e98db37
 static int
Radek Brich e98db37
 try_existing_file (struct cpio_file_stat* file_hdr, int in_file_des,
Radek Brich e98db37
-		   int *existing_dir)
Radek Brich e98db37
+		   int *existing_dir, mode_t *existing_mode)
Radek Brich e98db37
 {
Radek Brich e98db37
   struct stat file_stat;
Radek Brich e98db37
 
Radek Brich e98db37
   *existing_dir = false;
Radek Brich e98db37
+  *existing_mode = 0;
Radek Brich e98db37
   if (lstat (file_hdr->c_name, &file_stat) == 0)
Radek Brich e98db37
     {
Radek Brich e98db37
       if (S_ISDIR (file_stat.st_mode)
Radek Brich e98db37
@@ -200,6 +201,7 @@ try_existing_file (struct cpio_file_stat
Radek Brich e98db37
 	     we are trying to create, don't complain about
Radek Brich e98db37
 	     it.  */
Radek Brich e98db37
 	  *existing_dir = true;
Radek Brich e98db37
+	  *existing_mode = file_stat.st_mode;
Radek Brich e98db37
 	  return 0;
Radek Brich e98db37
 	}
Radek Brich e98db37
       else if (!unconditional_flag
Radek Brich e98db37
@@ -567,7 +569,7 @@ copyin_regular_file (struct cpio_file_st
Radek Brich e98db37
 }
Radek Brich e98db37
 
Radek Brich e98db37
 static void
Radek Brich e98db37
-copyin_directory (struct cpio_file_stat *file_hdr, int existing_dir)
Radek Brich e98db37
+copyin_directory (struct cpio_file_stat *file_hdr, int existing_dir, mode_t existing_mode)
Radek Brich e98db37
 {
Radek Brich e98db37
   int res;			/* Result of various function calls.  */
Radek Brich e98db37
 #ifdef HPUX_CDF
Radek Brich e98db37
@@ -610,14 +612,22 @@ copyin_directory (struct cpio_file_stat 
Radek Brich e98db37
 	  cdf_flag = 1;
Radek Brich e98db37
 	}
Radek Brich e98db37
 #endif
Radek Brich e98db37
-      res = mkdir (file_hdr->c_name, file_hdr->c_mode);
Radek Brich e98db37
+      res = mkdir (file_hdr->c_name, file_hdr->c_mode & ~077);
Radek Brich e98db37
     }
Radek Brich e98db37
   else
Radek Brich e98db37
-    res = 0;
Radek Brich e98db37
+    {
Radek Brich e98db37
+      if (!no_chown_flag && (existing_mode & 077) != 0
Radek Brich e98db37
+         && chmod (file_hdr->c_name, existing_mode & 07700) < 0)
Radek Brich e98db37
+       {
Radek Brich e98db37
+         error (0, errno, "%s: chmod", file_hdr->c_name);
Radek Brich e98db37
+         return;
Radek Brich e98db37
+       }
Radek Brich e98db37
+      res = 0;
Radek Brich e98db37
+    }
Radek Brich e98db37
   if (res < 0 && create_dir_flag)
Radek Brich e98db37
     {
Radek Brich e98db37
       create_all_directories (file_hdr->c_name);
Radek Brich e98db37
-      res = mkdir (file_hdr->c_name, file_hdr->c_mode);
Radek Brich e98db37
+      res = mkdir (file_hdr->c_name, file_hdr->c_mode & ~077);
Radek Brich e98db37
     }
Radek Brich e98db37
   if (res < 0)
Radek Brich e98db37
     {
Radek Brich e98db37
@@ -692,12 +702,12 @@ copyin_device (struct cpio_file_stat* fi
Radek Brich e98db37
       return;
Radek Brich e98db37
     }
Radek Brich e98db37
   
Radek Brich e98db37
-  res = mknod (file_hdr->c_name, file_hdr->c_mode,
Radek Brich e98db37
+  res = mknod (file_hdr->c_name, file_hdr->c_mode & ~077,
Radek Brich e98db37
 	    makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min));
Radek Brich e98db37
   if (res < 0 && create_dir_flag)
Radek Brich e98db37
     {
Radek Brich e98db37
       create_all_directories (file_hdr->c_name);
Radek Brich e98db37
-      res = mknod (file_hdr->c_name, file_hdr->c_mode,
Radek Brich e98db37
+      res = mknod (file_hdr->c_name, file_hdr->c_mode & ~077,
Radek Brich e98db37
 	    makedev (file_hdr->c_rdev_maj, file_hdr->c_rdev_min));
Radek Brich e98db37
     }
Radek Brich e98db37
   if (res < 0)
Radek Brich e98db37
@@ -772,9 +782,10 @@ static void
Radek Brich e98db37
 copyin_file (struct cpio_file_stat* file_hdr, int in_file_des)
Radek Brich e98db37
 {
Radek Brich e98db37
   int existing_dir;
Radek Brich e98db37
+  mode_t existing_mode;
Radek Brich e98db37
 
Radek Brich e98db37
   if (!to_stdout_option
Radek Brich e98db37
-      && try_existing_file (file_hdr, in_file_des, &existing_dir) < 0)
Radek Brich e98db37
+      && try_existing_file (file_hdr, in_file_des, &existing_dir, &existing_mode) < 0)
Radek Brich e98db37
     return;
Radek Brich e98db37
 
Radek Brich e98db37
   /* Do the real copy or link.  */
Radek Brich e98db37
@@ -785,7 +796,7 @@ copyin_file (struct cpio_file_stat* file
Radek Brich e98db37
       break;
Radek Brich e98db37
 
Radek Brich e98db37
     case CP_IFDIR:
Radek Brich e98db37
-      copyin_directory (file_hdr, existing_dir);
Radek Brich e98db37
+      copyin_directory(file_hdr, existing_dir, existing_mode);
Radek Brich e98db37
       break;
Radek Brich e98db37
 
Radek Brich e98db37
     case CP_IFCHR: