GNU bug report logs - #9002
file-error Doing chown operation not permitted

Previous Next

Package: emacs;

Reported by: jidanni <at> jidanni.org

Date: Tue, 5 Jul 2011 13:06:02 UTC

Severity: normal

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

Full log


Message #19 received at 9002 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: 9002 <at> debbugs.gnu.org
Subject: Re: bug#9002: file-error Doing chown operation not permitted
Date: Mon, 18 Jul 2011 10:24:06 -0700
In yet more testing I found a couple more issues.
First, many systems allow you to change gid on files
that you can't set the uid of, if you're a member of
the group and own the file.  Second, if we can't set
the uid and/or gid we shouldn't enable the setuid and/or
gid bits, as the result would be setuid and/or setgid
to the wrong user.  I pushed the following further
patch into the trunk.

* fileio.c (Fcopy_file): Adjust mode if fchown fails.  (Bug#9002)
If fchown fails to set both uid and gid, try to set just gid,
as that is sometimes allowed.  Adjust the file's mode to eliminate
setuid or setgid bits that are inappropriate if fchown fails.
=== modified file 'src/fileio.c'
--- src/fileio.c	2011-07-17 01:18:51 +0000
+++ src/fileio.c	2011-07-18 17:15:29 +0000
@@ -38,8 +38,6 @@
 #include <selinux/context.h>
 #endif

-#include <ignore-value.h>
-
 #include "lisp.h"
 #include "intervals.h"
 #include "buffer.h"
@@ -1961,9 +1959,21 @@
      owner and group.  */
   if (input_file_statable_p)
     {
+      int mode_mask = 07777;
       if (!NILP (preserve_uid_gid))
-	ignore_value (fchown (ofd, st.st_uid, st.st_gid));
-      if (fchmod (ofd, st.st_mode & 07777) != 0)
+	{
+	  /* Attempt to change owner and group.  If that doesn't work
+	     attempt to change just the group, as that is sometimes allowed.
+	     Adjust the mode mask to eliminate setuid or setgid bits
+	     that are inappropriate if the owner and group are wrong.  */
+	  if (fchown (ofd, st.st_uid, st.st_gid) != 0)
+	    {
+	      mode_mask &= ~06000;
+	      if (fchown (ofd, -1, st.st_gid) == 0)
+		mode_mask |= 02000;
+	    }
+	}
+      if (fchmod (ofd, st.st_mode & mode_mask) != 0)
 	report_file_error ("Doing chmod", Fcons (newname, Qnil));
     }
 #endif	/* not MSDOS */





This bug report was last modified 13 years and 315 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.