Commit 2e458a46 authored by William A. Rowe Jr's avatar William A. Rowe Jr
Browse files

  Use the appropriate APR_FINFO_flags for the apr_stat/lstat/getfileinfo
  calls to avoid ownership and permissions on Win32 when they are not
  required, and until they are implemented.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87873 13f79535-47bb-0310-9956-ffa450edef68
parent 7de7cc93
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
Changes with Apache 2.0b1

  *) Modify the apr_stat/lstat/getfileinfo calls within apache to use
     the most optimal APR_FINFO_wanted bits.  This spares Win32 from
     performing very expensive owner, group and permission lookups
     and allows the server to function until these apr_finfo_t fields
     are implemented under Win32.  [William Rowe]

  *) Support for typedsafe optional functions - that is functions exported by
     optional modules, which, therefore, may or may not be present, depending
     on configuration. See the experimental modules mod_optional_fn_{ex,im}port
+1 −1
Original line number Diff line number Diff line
@@ -1239,7 +1239,7 @@ static const char *isapi_cmd_cachefile(cmd_parms *cmd, void *dummy,
    
    fspec = ap_os_case_canonical_filename(cmd->pool, filename);
    if (apr_stat(&tmp, fspec, 
                 APR_FINFO_NORM, cmd->temp_pool) != APR_SUCCESS) { 
                 APR_FINFO_TYPE, cmd->temp_pool) != APR_SUCCESS) { 
	ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
	    "ISAPI: unable to stat(%s), skipping", filename);
	return NULL;
+2 −2
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ static const char *cachefile(cmd_parms *cmd, void *dummy, const char *filename)
    /* canonicalize the file name? */
    /* os_canonical... */
    /* XXX: uh... yea, or expect them to be -very- accurate typists */
    if ((rc = apr_stat(&tmp.finfo, filename, APR_FINFO_NORM, 
    if ((rc = apr_stat(&tmp.finfo, filename, APR_FINFO_MIN, 
                       cmd->temp_pool)) != APR_SUCCESS) {
	ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server,
	    "mod_file_cache: unable to stat(%s), skipping", filename);
@@ -250,7 +250,7 @@ static const char *mmapfile(cmd_parms *cmd, void *dummy, const char *filename)
    const char *fspec;

    fspec = ap_os_case_canonical_filename(cmd->pool, filename);
    if ((rc = apr_stat(&tmp.finfo, fspec, APR_FINFO_NORM, 
    if ((rc = apr_stat(&tmp.finfo, fspec, APR_FINFO_MIN, 
                       cmd->temp_pool)) != APR_SUCCESS) {
	ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server,
	    "mod_file_cache: unable to stat(%s), skipping", filename);
+17 −10
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ static int check_symlinks(char *d, int opts, apr_pool_t *p)
    else
        lastp = NULL;

    res = apr_lstat(&lfi, d, APR_FINFO_NORM, p);
    res = apr_lstat(&lfi, d, APR_FINFO_TYPE | APR_FINFO_OWNER, p);

    if (lastp)
        *lastp = '/';
@@ -190,7 +190,8 @@ static int check_symlinks(char *d, int opts, apr_pool_t *p)
     * the like may cons up a way to run the transaction anyway)...
     */

    if ((res != APR_SUCCESS) || lfi.filetype != APR_LNK)
    if ((res != APR_SUCCESS && res != APR_INCOMPLETE)
           || (lfi.filetype != APR_LNK))
        return OK;

    /* OK, it's a symlink.  May still be OK with OPT_SYM_OWNER */
@@ -198,11 +199,16 @@ static int check_symlinks(char *d, int opts, apr_pool_t *p)
    if (!(opts & OPT_SYM_OWNER))
        return HTTP_FORBIDDEN;

    if (apr_stat(&fi, d, APR_FINFO_NORM, p) != APR_SUCCESS)
    /* OPT_SYM_OWNER only works if we can get the owner from the file */

    if (res != APR_SUCCESS)
        return HTTP_FORBIDDEN;

    if (apr_stat(&fi, d, APR_FINFO_OWNER, p) != APR_SUCCESS)
        return HTTP_FORBIDDEN;

    return ((fi.valid & lfi.valid & APR_FINFO_OWNER)
            && (fi.user == lfi.user)) ? OK : HTTP_FORBIDDEN;
    /* TODO: replace with an apr_compare_users() fn */
    return (fi.user == lfi.user) ? OK : HTTP_FORBIDDEN;

#endif
}
@@ -281,7 +287,7 @@ static int get_path_info(request_rec *r)
        if (cp != end)
            *cp = '/';

        if (rv == APR_SUCCESS) {    
        if (rv == APR_SUCCESS || rv == APR_INCOMPLETE) {
            /*
             * Aha!  Found something.  If it was a directory, we will search
             * contents of that directory for a multi_match, so the PATH_INFO
@@ -297,8 +303,7 @@ static int get_path_info(request_rec *r)
            *cp = '\0';
            return OK;
        }

        if (APR_STATUS_IS_ENOENT(rv) || APR_STATUS_IS_ENOTDIR(rv)) {
        else if (APR_STATUS_IS_ENOENT(rv) || APR_STATUS_IS_ENOTDIR(rv)) {
            last_cp = cp;

            while (--cp > path && *cp != '/')
@@ -967,13 +972,15 @@ AP_DECLARE(request_rec *) ap_sub_req_lookup_file(const char *new_file,

    if (ap_strchr_c(new_file, '/') == NULL) {
        char *udir = ap_make_dirstr_parent(rnew->pool, r->uri);
        apr_status_t rv;

        rnew->uri = ap_make_full_path(rnew->pool, udir, new_file);
        rnew->filename = ap_make_full_path(rnew->pool, fdir, new_file);
        ap_parse_uri(rnew, rnew->uri);    /* fill in parsed_uri values */

        if (apr_stat(&rnew->finfo, rnew->filename,
                     APR_FINFO_NORM, rnew->pool) != APR_SUCCESS) {
        if (((rv = apr_stat(&rnew->finfo, rnew->filename,
                           APR_FINFO_NORM, rnew->pool)) != APR_SUCCESS)
                                                 && (rv != APR_INCOMPLETE)) {
            rnew->finfo.protection = 0;
        }

+1 −1
Original line number Diff line number Diff line
@@ -1468,7 +1468,7 @@ static float find_content_length(negotiation_state *neg, var_rec *variant)
                                           variant->file_name);

        if (apr_stat(&statb, fullname,
                     APR_FINFO_NORM, neg->pool) == APR_SUCCESS) {
                     APR_FINFO_SIZE, neg->pool) == APR_SUCCESS) {
            /* Note, precision may be lost */
            variant->bytes = (float) statb.size;
        }
Loading