Jeff,
I like this solution as well! [sorry, I've had little time on my hands,
and no time to chime in on your earlier pleas for comment :-( ]
There are two other cases; the pre-queried or quick-stat'ed
r->finfo before we entered dir_walk's path parsing loop, and the
the initial lstat() leg, which we don't hit with this patch. [e.g.
only an APR_LNK that is re-stat()'ed is caught in this leg
of the code.] Do we need extra tests on those two legs,
as well? E.g. subreq_lookup_file may already have stat()ed
the file, or [per the group's request] we will try to stat() on
entry and save ourselves the effort within the loop.
I don't know that I would be opposed to catching this in
apr_stat() as well. Sure, apr_file_open would succeed in
spite of the fact that apr_stat() fails, but the point to the
apr_file and apr_filepath functions were to normalize many
different OS'es into similar behavior. You wouldn't need to
actually stat() a file to reject from apr_open(), either. Simply
testing for a trailing slash would be sufficient. But I'd rather
see us keep our 'faith' low right now, and have extra tests
in dir_walk that ensure security, then to discover exploits
later on. dir_walk was the right [first] patch :-)
Thanks for all your research on this odd exception!
Bill
At 07:35 AM 3/15/2002, you wrote:
>trawick 02/03/15 05:35:42
>
> Modified: . CHANGES
> server request.c
> Log:
> Allow URIs specifying CGI scripts to include '/' at the end
> (e.g., /cgi-bin/printenv/) on AIX and Solaris (and other OSs
> which ignore '/' at the end of the names of non-directories).
>
> PR: 10138
>
> Revision Changes Path
> 1.636 +5 -0 httpd-2.0/CHANGES
>
> Index: CHANGES
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/CHANGES,v
> retrieving revision 1.635
> retrieving revision 1.636
> diff -u -r1.635 -r1.636
> --- CHANGES 14 Mar 2002 23:31:22 -0000 1.635
> +++ CHANGES 15 Mar 2002 13:35:42 -0000 1.636
> @@ -1,5 +1,10 @@
> Changes with Apache 2.0.34-dev
>
> + *) Allow URIs specifying CGI scripts to include '/' at the end
> + (e.g., /cgi-bin/printenv/) on AIX and Solaris (and other OSs
> + which ignore '/' at the end of the names of non-directories).
> + PR 10138 [Jeff Trawick]
> +
> *) implement SSLSessionCache shmht and shmcb based on apr_rmm and
> apr_shm. [Madhusudan Mathihalli <[EMAIL PROTECTED]>]
>
>
>
>
> 1.107 +14 -0 httpd-2.0/server/request.c
>
> Index: request.c
> ===================================================================
> RCS file: /home/cvs/httpd-2.0/server/request.c,v
> retrieving revision 1.106
> retrieving revision 1.107
> diff -u -r1.106 -r1.107
> --- request.c 13 Mar 2002 20:48:00 -0000 1.106
> +++ request.c 15 Mar 2002 13:35:42 -0000 1.107
> @@ -556,6 +556,20 @@
> */
> if (!r->finfo.filetype || r->finfo.filetype == APR_LNK) {
> apr_stat(&r->finfo, r->filename, APR_FINFO_MIN, r->pool);
> +
> + /* some OSs will return APR_SUCCESS/APR_REG if we stat
> + * a regular file but we have '/' at the end of the name;
> + *
> + * other OSs will return APR_ENOTDIR for that situation;
> + *
> + * handle it the same everywhere by simulating a failure
> + * if it looks like a directory but really isn't
> + */
> + if (r->finfo.filetype &&
> + r->finfo.filetype != APR_DIR &&
> + r->filename[strlen(r->filename) - 1] == '/') {
> + r->finfo.filetype = 0; /* forget what we learned */
> + }
> }
>
> if (r->finfo.filetype == APR_REG) {
>
>
>