bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#13125: Fix permissions bugs with setgid directories etc.


From: Wolfgang Jenkner
Subject: bug#13125: Fix permissions bugs with setgid directories etc.
Date: Sun, 09 Dec 2012 17:43:31 +0100
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.3.50 (berkeley-unix)

On Sun, Dec 09 2012, Paul Eggert wrote:

> In several places Emacs assumes that on 4.2BSD hosts, a newly created
> file is given a group ID equal to its parent directory, and that on
> non-4.2BSD hosts the new files are given Emacs's group ID.  Although
> this was true long ago, it hasn't been true for many years.  Most
> commonly, the old 4.2BSD behavior is now selected by the setgid bit on
> directories.

I understand you are describing here the most common behaviour only for
non-4.2BSD descendants?

I've tested your patch by typing the following in a *shell* buffer.

[[1 ~]]$ uname -rs
FreeBSD 9.1-PRERELEASE
[[2 ~]]$ id
uid=1002(wolfgang) gid=20(staff) groups=20(staff),0(wheel),5(operator)
[[3 ~]]$ ls -ld /tmp
drwxrwxrwt  8 root  wheel  512 Dec  9 16:59 /tmp/
[[4 ~]]$ rm -f /tmp/foo && touch $_
[[5 ~]]$ ls -l $_
-rw-r--r--  1 wolfgang  wheel  0 Dec  9 17:01 /tmp/foo
[[6 ~]]$ 

Then, in the same emacs process, I evaluate

(file-ownership-preserved-p "/tmp/foo")
=> t

which is fine, but

(file-ownership-preserved-p "/tmp/foo" t)
=> nil

is not since /tmp/foo will always be created in the wheel group.
Indeed, in an unpatched emacs, I get the expected

(nth 9 (file-attributes "/tmp/foo"))
=> nil

Now, open(2) on all free BSD descendants invariably, literally and
unconditionally states

     When a new file is created it is given the group of the directory which
     contains it.

So I wonder if the following lightly tested patch (on top of yours)
would give better results in this case (in the absence of races with
other processes).

Wolfgang

=== modified file 'lisp/files.el'
--- lisp/files.el       2012-12-09 15:29:12 +0000
+++ lisp/files.el       2012-12-09 16:25:09 +0000
@@ -4039,6 +4039,7 @@
                     (and (eq system-type 'windows-nt)
                          (= (user-uid) 500) (= (nth 2 attributes) 544)))
                 (or (not group)
+                    (memq system-type '(berkeley-unix darwin))
                     (= (nth 3 attributes) (group-gid)))
                 (let* ((parent (or (file-name-directory file) "."))
                        (parent-attributes (file-attributes parent 'integer)))
@@ -4052,7 +4053,10 @@
                        ;; inherits that directory's group.  On some systems
                        ;; this happens even if the setgid bit is not set.
                        (or (not group)
-                           (= (nth 3 parent-attributes) (group-gid)))))))))))
+                           (= (nth 3 parent-attributes)
+                              (if (memq system-type '(berkeley-unix darwin))
+                                  (nth 3 attributes)
+                                (group-gid))))))))))))
 
 (defun file-name-sans-extension (filename)
   "Return FILENAME sans final \"extension\".






reply via email to

[Prev in Thread] Current Thread [Next in Thread]