*stat()-ing symlinks with trailing slashes

Vlad GALU dudu at dudu.ro
Fri May 22 19:58:45 UTC 2009


On 5/22/09, Vlad GALU <dudu at dudu.ro> wrote:
> -- cut here --
>  root at goofy / # rm -f passwd
>  root at goofy / # ln -s /etc/passwd passwd
>  root at goofy / # stat passwd
>  74 3 lrwxr-xr-x 1 root wheel 1668572463 11 "May 22 19:34:17 2009" "May
>  22 19:34:17 2009" "May 22 19:34:17 2009" "May 22 19:34:17 2009" 4096 0
>  0 passwd
>  root at goofy / # stat passwd/
>  74 95688 -rw-r--r-- 1 root wheel 393192 2158 "May 21 09:27:10 2009"
>  "May 21 09:27:10 2009" "May 22 17:25:49 2009" "Apr  7 13:05:32 2008"
>  4096 8 0 passwd/
>  root at goofy / #
>  -- and here --
>
>  stat(1) is smart enough to figure out that my /passwd is a symlink
>  then calls lstat() on it, thus returning the struct stat corresponding
>  to /etc/passwd
>  However, there's http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/21768
>
>  vfs_lookup.c has this piece of code:
>  -- cut here --
>         /*
>          * Check for bogus trailing slashes.
>          */
>         if (trailing_slash && dp->v_type != VDIR) {
>                 error = ENOTDIR;
>                 goto bad2;
>         }
>  -- and here --
>
>  I've CC-ed my friend Mircea Danila, who noticed this behavior with lighttpd.
>  As my friend Mircea Danila, who I've CC-ed found out, lighttpd mistakenly treats
>

So, to finish my idea, since I wasn't previously able to write a fully
coherent mail, the behavior is that lighttpd returns the full source
of scripts, instead of executing them, when they're symlinks and when
the GET requests has a trailing "/". When there's no trailing slash,
they get executed, as expected. The lighttpd devs say that, due to
stat() not returning ENOTDIR, they simply try to list the content.

Unfortunately I haven't dug any deeper into this, but merely proxied
the symptoms from Mircea to this list. He should be able to provide
more input on request.


More information about the freebsd-fs mailing list