SOURCES: cpio-CAN_2005_111.patch (NEW) - race condition in copyin.c

krolik krolik at pld-linux.org
Mon Jul 25 15:33:15 CEST 2005


Author: krolik                       Date: Mon Jul 25 13:33:15 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- race condition in copyin.c

---- Files affected:
SOURCES:
   cpio-CAN_2005_111.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/cpio-CAN_2005_111.patch
diff -u /dev/null SOURCES/cpio-CAN_2005_111.patch:1.1
--- /dev/null	Mon Jul 25 15:33:15 2005
+++ SOURCES/cpio-CAN_2005_111.patch	Mon Jul 25 15:33:10 2005
@@ -0,0 +1,121 @@
+--- cpio-2.6/src/copyin.c.chmodRaceC	2005-04-25 13:19:34.079310381 +0200
++++ cpio-2.6/src/copyin.c	2005-04-25 14:09:32.514889697 +0200
+@@ -389,19 +389,26 @@
+ 	  continue;
+ 	}
+ 
+-      if (close (out_file_des) < 0)
+-	error (0, errno, "%s", d->header.c_name);
+-
++      /*
++       *  Avoid race condition.
++       *  Set chown and chmod before closing the file desc.
++       *  pvrabec at redhat.com
++       */
++       
+       /* File is now copied; set attributes.  */
+       if (!no_chown_flag)
+-	if ((chown (d->header.c_name,
++	if ((fchown (out_file_des,
+ 		    set_owner_flag ? set_owner : d->header.c_uid,
+ 	       set_group_flag ? set_group : d->header.c_gid) < 0)
+ 	    && errno != EPERM)
+ 	  error (0, errno, "%s", d->header.c_name);
+       /* chown may have turned off some permissions we wanted. */
+-      if (chmod (d->header.c_name, (int) d->header.c_mode) < 0)
++      if (fchmod (out_file_des, (int) d->header.c_mode) < 0)
++	error (0, errno, "%s", d->header.c_name);
++
++      if (close (out_file_des) < 0)
+ 	error (0, errno, "%s", d->header.c_name);
++
+       if (retain_time_flag)
+ 	{
+ 	  times.actime = times.modtime = d->header.c_mtime;
+@@ -557,6 +564,25 @@
+       write (out_file_des, "", 1);
+       delayed_seek_count = 0;
+     }
++    
++  /*
++   *  Avoid race condition.
++   *  Set chown and chmod before closing the file desc.
++   *  pvrabec at redhat.com
++   */
++   
++  /* File is now copied; set attributes.  */
++  if (!no_chown_flag)
++    if ((fchown (out_file_des,
++		set_owner_flag ? set_owner : file_hdr->c_uid,
++	   set_group_flag ? set_group : file_hdr->c_gid) < 0)
++	&& errno != EPERM)
++      error (0, errno, "%s", file_hdr->c_name);
++  
++  /* chown may have turned off some permissions we wanted. */
++  if (fchmod (out_file_des, (int) file_hdr->c_mode) < 0)
++    error (0, errno, "%s", file_hdr->c_name);
++     
+   if (close (out_file_des) < 0)
+     error (0, errno, "%s", file_hdr->c_name);
+ 
+@@ -567,18 +593,6 @@
+ 	       file_hdr->c_name, crc, file_hdr->c_chksum);
+     }
+ 
+-  /* File is now copied; set attributes.  */
+-  if (!no_chown_flag)
+-    if ((chown (file_hdr->c_name,
+-		set_owner_flag ? set_owner : file_hdr->c_uid,
+-	   set_group_flag ? set_group : file_hdr->c_gid) < 0)
+-	&& errno != EPERM)
+-      error (0, errno, "%s", file_hdr->c_name);
+-  
+-  /* chown may have turned off some permissions we wanted. */
+-  if (chmod (file_hdr->c_name, (int) file_hdr->c_mode) < 0)
+-    error (0, errno, "%s", file_hdr->c_name);
+-  
+   if (retain_time_flag)
+     {
+       struct utimbuf times;		/* For setting file times.  */
+@@ -589,7 +603,7 @@
+       if (utime (file_hdr->c_name, &times) < 0)
+ 	error (0, errno, "%s", file_hdr->c_name);
+     }
+-  
++    
+   tape_skip_padding (in_file_des, file_hdr->c_filesize);
+   if (file_hdr->c_nlink > 1
+       && (archive_format == arf_newascii || archive_format == arf_crcascii) )
+--- cpio-2.6/src/copypass.c.chmodRaceC	2004-09-06 14:09:04.000000000 +0200
++++ cpio-2.6/src/copypass.c	2005-04-25 14:09:38.135076926 +0200
+@@ -181,19 +181,25 @@
+ 		}
+ 	      if (close (in_file_des) < 0)
+ 		error (0, errno, "%s", input_name.ds_string);
+-	      if (close (out_file_des) < 0)
+-		error (0, errno, "%s", output_name.ds_string);
+-
++	      /*
++	       *  Avoid race condition.
++	       *  Set chown and chmod before closing the file desc.
++	       *  pvrabec at redhat.com
++	       */
+ 	      /* Set the attributes of the new file.  */
+ 	      if (!no_chown_flag)
+-		if ((chown (output_name.ds_string,
++		if ((fchown (out_file_des,
+ 			    set_owner_flag ? set_owner : in_file_stat.st_uid,
+ 		      set_group_flag ? set_group : in_file_stat.st_gid) < 0)
+ 		    && errno != EPERM)
+ 		  error (0, errno, "%s", output_name.ds_string);
+ 	      /* chown may have turned off some permissions we wanted. */
+-	      if (chmod (output_name.ds_string, in_file_stat.st_mode) < 0)
++	      if (fchmod (out_file_des, in_file_stat.st_mode) < 0)
++		error (0, errno, "%s", output_name.ds_string);
++		
++	      if (close (out_file_des) < 0)
+ 		error (0, errno, "%s", output_name.ds_string);
++
+ 	      if (reset_time_flag)
+ 		{
+ 		  times.actime = in_file_stat.st_atime;
================================================================



More information about the pld-cvs-commit mailing list