]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
install: fix security race
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 20 Nov 2012 21:15:34 +0000 (13:15 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 20 Nov 2012 21:17:16 +0000 (13:17 -0800)
* src/copy.c (copy_internal): Use DST_MODE_BITS, not SRC_MODE.
See Bernhard R. Link in <http://bugs.gnu.org/12947> and in
<http://bugs.debian.org/598018>.

src/copy.c

index 16aed036d278bcd80294fff631456dd9466a2d14..7a354140ad44801a8e1aa163f3947fbd747d4bb5 100644 (file)
@@ -2394,8 +2394,13 @@ copy_internal (char const *src_name, char const *dst_name,
       /* POSIX says the permission bits of the source file must be
          used as the 3rd argument in the open call.  Historical
          practice passed all the source mode bits to 'open', but the extra
-         bits were ignored, so it should be the same either way.  */
-      if (! copy_reg (src_name, dst_name, x, src_mode & S_IRWXUGO,
+         bits were ignored, so it should be the same either way.
+
+         This call uses DST_MODE_BITS, not SRC_MODE.  These are
+         normally the same, and the exception (where x->set_mode) is
+         used only by 'install', which POSIX does not specify and
+         where DST_MODE_BITS is what's wanted.  */
+      if (! copy_reg (src_name, dst_name, x, dst_mode_bits & S_IRWXUGO,
                       omitted_permissions, &new_dst, &src_sb))
         goto un_backup;
     }