Dan:
> Gid inherits top level directory GID?
Wietse:
> Turn off the SETGID bit in the PARENT directory.
Dan:
> There is no setgid bit set.
Apparently, FreeBSD copies the GID of a new directory from its
parent, even when the parent does not have sticky/setwhatever
bits set.
bristle# mkdir /var/spool/wietse
bristle# chown wietse /var/spool/wietse
bristle# ls -la /var/spool/wietse
total 4
drwxr-xr-x 2 wietse wheel 512 Dec 1 09:02 .
drwxr-xr-x 12 root wheel 512 Dec 1 09:02 ..
bristle# su wietse -c 'mkdir /var/spool/wietse/test1'
bristle# ls -la /var/spool/wietse
total 6
drwxr-xr-x 3 wietse wheel 512 Dec 1 09:03 .
drwxr-xr-x 12 root wheel 512 Dec 1 09:02 ..
drwxr-xr-x 2 wietse wheel 512 Dec 1 09:03 test1
The test1 directory has group wietse, even though my process
has GID 'wietse'.
Now, I change the parent directory group to 'wietse'
and create a new directory:
bristle# chgrp wietse /var/spool/wietse
bristle# su wietse -c 'mkdir /var/spool/wietse/test2'
bristle# ls -la /var/spool/wietse
total 8
drwxr-xr-x 4 wietse wietse 512 Dec 1 09:03 .
drwxr-xr-x 12 root wheel 512 Dec 1 09:02 ..
drwxr-xr-x 2 wietse wheel 512 Dec 1 09:03 test1
drwxr-xr-x 2 wietse wietse 512 Dec 1 09:03 test2
And test2 has the group of 'wietse'.
bristle# su wietse -c 'chgrp wietse /var/spool/wietse/test1'
bristle# ls -la /var/spool/wietse
total 8
drwxr-xr-x 4 wietse wietse 512 Dec 1 09:03 .
drwxr-xr-x 12 root wheel 512 Dec 1 09:02 ..
drwxr-xr-x 2 wietse wietse 512 Dec 1 09:03 test1
drwxr-xr-x 2 wietse wietse 512 Dec 1 09:03 test2
To force the group, change the group after mkdir. This
does not require switching euid to root.
Wietse
In src/util/make_dirs.c:
if ((ret = mkdir(saved_path, perms)) < 0) {
if (errno != EEXIST)
break;
/* Race condition? */
if ((ret = stat(saved_path, &st)) < 0)
break;
if (!S_ISDIR(st.st_mode)) {
errno = ENOTDIR;
ret = -1;
break;
}
}
===> if ((ret = chown(saved_path, -1, getegid())) < 0)
===> break;
Wietse