*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