1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

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
This commit is contained in:
William A. Rowe Jr
2001-01-27 21:28:28 +00:00
parent fce4fb7fb3
commit 7f4a5fe7f5
16 changed files with 43 additions and 30 deletions

View File

@@ -1,5 +1,11 @@
Changes with Apache 2.0b1 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 *) Support for typedsafe optional functions - that is functions exported by
optional modules, which, therefore, may or may not be present, depending optional modules, which, therefore, may or may not be present, depending
on configuration. See the experimental modules mod_optional_fn_{ex,im}port on configuration. See the experimental modules mod_optional_fn_{ex,im}port

View File

@@ -1239,7 +1239,7 @@ static const char *isapi_cmd_cachefile(cmd_parms *cmd, void *dummy,
fspec = ap_os_case_canonical_filename(cmd->pool, filename); fspec = ap_os_case_canonical_filename(cmd->pool, filename);
if (apr_stat(&tmp, fspec, 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, ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
"ISAPI: unable to stat(%s), skipping", filename); "ISAPI: unable to stat(%s), skipping", filename);
return NULL; return NULL;

View File

@@ -200,7 +200,7 @@ static const char *cachefile(cmd_parms *cmd, void *dummy, const char *filename)
/* canonicalize the file name? */ /* canonicalize the file name? */
/* os_canonical... */ /* os_canonical... */
/* XXX: uh... yea, or expect them to be -very- accurate typists */ /* 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) { cmd->temp_pool)) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server, ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server,
"mod_file_cache: unable to stat(%s), skipping", filename); "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; const char *fspec;
fspec = ap_os_case_canonical_filename(cmd->pool, filename); 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) { cmd->temp_pool)) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server, ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server,
"mod_file_cache: unable to stat(%s), skipping", filename); "mod_file_cache: unable to stat(%s), skipping", filename);

View File

@@ -180,7 +180,7 @@ static int check_symlinks(char *d, int opts, apr_pool_t *p)
else else
lastp = NULL; 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) if (lastp)
*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)... * 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; return OK;
/* OK, it's a symlink. May still be OK with OPT_SYM_OWNER */ /* 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)) if (!(opts & OPT_SYM_OWNER))
return HTTP_FORBIDDEN; 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; return HTTP_FORBIDDEN;
return ((fi.valid & lfi.valid & APR_FINFO_OWNER) if (apr_stat(&fi, d, APR_FINFO_OWNER, p) != APR_SUCCESS)
&& (fi.user == lfi.user)) ? OK : HTTP_FORBIDDEN; return HTTP_FORBIDDEN;
/* TODO: replace with an apr_compare_users() fn */
return (fi.user == lfi.user) ? OK : HTTP_FORBIDDEN;
#endif #endif
} }
@@ -281,7 +287,7 @@ static int get_path_info(request_rec *r)
if (cp != end) if (cp != end)
*cp = '/'; *cp = '/';
if (rv == APR_SUCCESS) { if (rv == APR_SUCCESS || rv == APR_INCOMPLETE) {
/* /*
* Aha! Found something. If it was a directory, we will search * Aha! Found something. If it was a directory, we will search
* contents of that directory for a multi_match, so the PATH_INFO * 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'; *cp = '\0';
return OK; return OK;
} }
else if (APR_STATUS_IS_ENOENT(rv) || APR_STATUS_IS_ENOTDIR(rv)) {
if (APR_STATUS_IS_ENOENT(rv) || APR_STATUS_IS_ENOTDIR(rv)) {
last_cp = cp; last_cp = cp;
while (--cp > path && *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) { if (ap_strchr_c(new_file, '/') == NULL) {
char *udir = ap_make_dirstr_parent(rnew->pool, r->uri); 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->uri = ap_make_full_path(rnew->pool, udir, new_file);
rnew->filename = ap_make_full_path(rnew->pool, fdir, new_file); rnew->filename = ap_make_full_path(rnew->pool, fdir, new_file);
ap_parse_uri(rnew, rnew->uri); /* fill in parsed_uri values */ ap_parse_uri(rnew, rnew->uri); /* fill in parsed_uri values */
if (apr_stat(&rnew->finfo, rnew->filename, if (((rv = apr_stat(&rnew->finfo, rnew->filename,
APR_FINFO_NORM, rnew->pool) != APR_SUCCESS) { APR_FINFO_NORM, rnew->pool)) != APR_SUCCESS)
&& (rv != APR_INCOMPLETE)) {
rnew->finfo.protection = 0; rnew->finfo.protection = 0;
} }

View File

@@ -1468,7 +1468,7 @@ static float find_content_length(negotiation_state *neg, var_rec *variant)
variant->file_name); variant->file_name);
if (apr_stat(&statb, fullname, if (apr_stat(&statb, fullname,
APR_FINFO_NORM, neg->pool) == APR_SUCCESS) { APR_FINFO_SIZE, neg->pool) == APR_SUCCESS) {
/* Note, precision may be lost */ /* Note, precision may be lost */
variant->bytes = (float) statb.size; variant->bytes = (float) statb.size;
} }

View File

@@ -1239,7 +1239,7 @@ static const char *isapi_cmd_cachefile(cmd_parms *cmd, void *dummy,
fspec = ap_os_case_canonical_filename(cmd->pool, filename); fspec = ap_os_case_canonical_filename(cmd->pool, filename);
if (apr_stat(&tmp, fspec, 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, ap_log_error(APLOG_MARK, APLOG_WARNING, errno, cmd->server,
"ISAPI: unable to stat(%s), skipping", filename); "ISAPI: unable to stat(%s), skipping", filename);
return NULL; return NULL;

View File

@@ -1271,17 +1271,17 @@ void ap_process_resource_config(server_rec *s, const char *fname,
if ((ap_server_pre_read_config->nelts if ((ap_server_pre_read_config->nelts
|| ap_server_post_read_config->nelts) || ap_server_post_read_config->nelts)
&& !(strcmp(fname, ap_server_root_relative(p, SERVER_CONFIG_FILE)))) { && !(strcmp(fname, ap_server_root_relative(p, SERVER_CONFIG_FILE)))) {
if (apr_stat(&finfo, fname, APR_FINFO_NORM, p) != APR_SUCCESS) if (apr_lstat(&finfo, fname, APR_FINFO_TYPE, p) != APR_SUCCESS)
return; return;
} }
/* /*
* here we want to check if the candidate file is really a * here we want to check if the candidate file is really a
* directory, and most definitely NOT a symlink (to prevent * directory, and most definitely NOT a symlink (to prevent
* horrible loops). If so, let's recurse and toss it back into * horrible loops). So we do so above using apr_lstat.
* the function. * If so, let's recurse and toss it back into the function.
*/ */
if (ap_is_rdirectory(ptemp, fname)) { if (finfo.filetype == APR_DIR) {
apr_dir_t *dirp; apr_dir_t *dirp;
apr_finfo_t dirent; apr_finfo_t dirent;
int current; int current;

View File

@@ -521,7 +521,7 @@ void ap_log_pid(apr_pool_t *p, const char *fname)
fname = ap_server_root_relative(p, fname); fname = ap_server_root_relative(p, fname);
mypid = getpid(); mypid = getpid();
if (mypid != saved_pid if (mypid != saved_pid
&& apr_stat(&finfo, fname, APR_FINFO_NORM, p) == APR_SUCCESS) { && apr_stat(&finfo, fname, APR_FINFO_MTIME, p) == APR_SUCCESS) {
/* WINCH and HUP call this on each restart. /* WINCH and HUP call this on each restart.
* Only warn on first time through for this pid. * Only warn on first time through for this pid.
* *

View File

@@ -1003,7 +1003,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, const char *arg
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -1347,7 +1347,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, const char *arg
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -1015,7 +1015,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, char *arg)
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -1364,7 +1364,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy,
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -1715,7 +1715,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, const char *arg
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -1496,7 +1496,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, char *arg)
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -2299,7 +2299,7 @@ static const char *set_coredumpdir (cmd_parms *cmd, void *dummy, char *arg)
} }
fname = ap_server_root_relative(cmd->pool, arg); fname = ap_server_root_relative(cmd->pool, arg);
if ((apr_stat(&finfo, fname, APR_FINFO_NORM, cmd->pool) != APR_SUCCESS) if ((apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool) != APR_SUCCESS)
|| (finfo.filetype != APR_DIR)) { || (finfo.filetype != APR_DIR)) {
return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname,
" does not exist or is not a directory", NULL); " does not exist or is not a directory", NULL);

View File

@@ -895,7 +895,7 @@ AP_DECLARE(apr_status_t) ap_pcfg_openfile(configfile_t **ret_cfg, apr_pool_t *p,
if (status != APR_SUCCESS) if (status != APR_SUCCESS)
return status; return status;
status = apr_getfileinfo(&finfo, APR_FINFO_NORM, file); status = apr_getfileinfo(&finfo, APR_FINFO_TYPE, file);
if (status != APR_SUCCESS) if (status != APR_SUCCESS)
return status; return status;
@@ -1679,7 +1679,7 @@ AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *path)
{ {
apr_finfo_t finfo; apr_finfo_t finfo;
if (apr_stat(&finfo, path, APR_FINFO_NORM, p) != APR_SUCCESS) if (apr_stat(&finfo, path, APR_FINFO_TYPE, p) != APR_SUCCESS)
return 0; /* in error condition, just return no */ return 0; /* in error condition, just return no */
return (finfo.filetype == APR_DIR); return (finfo.filetype == APR_DIR);
@@ -1689,7 +1689,7 @@ AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *path)
{ {
apr_finfo_t finfo; apr_finfo_t finfo;
if (apr_lstat(&finfo, path, APR_FINFO_NORM, p) != APR_SUCCESS) if (apr_lstat(&finfo, path, APR_FINFO_TYPE, p) != APR_SUCCESS)
return 0; /* in error condition, just return no */ return 0; /* in error condition, just return no */
return (finfo.filetype == APR_DIR); return (finfo.filetype == APR_DIR);