umask & symbolic links on MacOS X
This just annoyed me again:
$ umask 0022 $ touch foo $ umask 0066 $ ln -s foo bar $ ls -lgo foo bar -rw-r--r-- 1 0 Mar 9 14:17 foo lrwx--x--x 1 3 Mar 9 14:17 bar -> foo $ sudo -u nobody cat foo bar $OK, this seems to work (the permissions are checked on the target, not the symlink), but not so with directories:
$ umask 0022 $ mkdir -p foo/file $ umask 0066 $ ln -s foo bar $ ls -ldgo foo bar drwxr-xr-x 3 102 Mar 9 15:02 foo lrwx--x--x 1 3 Mar 9 15:03 bar -> foo $ sudo -u nobody ls -l bar ls: bar: Permission denied lrwx--x--x 1 admin wheel 3 Mar 9 14:23 barInterestingly enough, it works if we append a slash to the symlink:
$ sudo -u nobody ls -lgo bar/ total 0 drwxr-xr-x 2 68 Mar 9 14:24 dirThis is annoying when a user has a more stringent umask for normal use, but temporarily elevates its privileges to install software, without adjusting the
umask
first. To clean up this mess afterwards, we can re-create the affected symbolic links:
$ umask 0022 $ find . -type l ! -perm -g+r | while read l; do target=$(readlink "$l") && rm -f "$l" && ln -svf "$target" "$l" done ./bar -> foo $ ls -ld foo bar drwxr-xr-x 4 admin wheel 136 Mar 9 14:37 foo lrwxr-xr-x 1 admin wheel 3 Mar 9 14:38 bar -> fooNote: this has been seen in MacOS 10.10.5 on a Journaled HFS+ file system.