I hate to have to do this... I realized that ++seg should only be incremented when the optimization results in either a "continue" or a "break". Here is the correction:
CODE: if (r->finfo.filetype #ifdef CASE_BLIND_FILESYSTEM && (filename_len <= canonical_len) #endif && (opts.opts & OPT_SYM_LINKS) ) { if ((r->path_info && *r->path_info) || r->finfo.filetype == APR_DIR) { thisinfo.filetype = APR_DIR; ++seg; continue; } else if (r->finfo.filetype == APR_REG) { thisinfo.filetype = APR_REG; ++seg; break; } } PATCH: --- .svn/text-base/request.c.svn-base 2007-06-04 23:40:23.801630400 -0400 +++ request.c 2007-06-13 21:34:01.659559100 -0400 @@ -931,13 +931,21 @@ #ifdef CASE_BLIND_FILESYSTEM && (filename_len <= canonical_len) #endif - && ((opts.opts & (OPT_SYM_OWNER | OPT_SYM_LINKS)) == OPT_SYM_LINKS)) + && (opts.opts & OPT_SYM_LINKS) ) + { + if ((r->path_info && *r->path_info) || r->finfo.filetype == APR_DIR) { - thisinfo.filetype = APR_DIR; ++seg; continue; } + else if (r->finfo.filetype == APR_REG) + { + thisinfo.filetype = APR_REG; + ++seg; + break; + } + } /* We choose apr_stat with flag APR_FINFO_LINK here, rather that * plain apr_stat, so that we capture this path object rather than ANALYSIS: The optimization formerly skipped the lstat and went directly to the htaccess check, even when it reached the point of checking the full path and the full path referred to a file. This resulted in a spurious open attempt on .../file.html/.htaccess The revised optimization also skips the lstat and goes directly to the htaccess check, but only when (a) the directory walk has not yet reached the full path; or (b) the full path refers to a directory. Otherwise, when it reaches the full path, if the full path refers to a regular file, it terminates the directory walk. If the file type of the full path is not a directory or a regular file, it continues on with the unoptimized lstat of the full path.
request.c.diff
Description: Binary data