Changes with Apache 1.3.35
- *) HTML-escape the Expect error message. Not classed as security as
- an attacker has no way to influence the Expect header a victim will
- send to a target site. Reported by Thiago Zaninotti
- <thiango nstalker.com>. [Mark Cox]
-
*) SECURITY: CVE-2005-3352 (cve.mitre.org)
mod_imap: Escape untrusted referer header before outputting in HTML
to avoid potential cross-site scripting. Change also made to
ap_escape_html so we escape quotes. Reported by JPCERT.
[Mark Cox]
+ *) core: Allow usage of the "Include" configuration directive within
+ previously "Include"d files. [Colm MacCarthaigh]
+
+ *) HTML-escape the Expect error message. Not classed as security as
+ an attacker has no way to influence the Expect header a victim will
+ send to a target site. Reported by Thiago Zaninotti
+ <thiango nstalker.com>. [Mark Cox]
+
*) mod_cgi: Remove block on OPTIONS method so that scripts can
respond to OPTIONS directly rather than via server default.
[Roy Fielding] PR 15242
return strcmp(f1->fname,f2->fname);
}
+CORE_EXPORT(void) ap_process_include_config(server_rec *s, char *fname, pool *p, pool *ptemp,
+ cmd_parms *parms)
+{
+ const char *errmsg;
+ struct stat finfo;
+
+ fname = ap_server_root_relative(p, fname);
+
+ if (stat(fname, &finfo) == -1)
+ return;
+
+ /*
+ * here we want to check if the candidate file is really a
+ * directory, and most definitely NOT a symlink (to prevent
+ * horrible loops). If so, let's recurse and toss it back into
+ * the function.
+ */
+ if (ap_is_rdirectory(fname)) {
+ DIR *dirp;
+ struct DIR_TYPE *dir_entry;
+ int current;
+ array_header *candidates = NULL;
+ fnames *fnew;
+
+ /*
+ * first course of business is to grok all the directory
+ * entries here and store 'em away. Recall we need full pathnames
+ * for this.
+ */
+ fprintf(stderr, "Processing config directory: %s\n", fname);
+ dirp = ap_popendir(p, fname);
+ if (dirp == NULL) {
+ perror("fopen");
+ fprintf(stderr, "%s: could not open config directory %s\n",
+ ap_server_argv0, fname);
+#ifdef NETWARE
+ clean_parent_exit(1);
+#else
+ exit(1);
+#endif
+ }
+ candidates = ap_make_array(p, 1, sizeof(fnames));
+ while ((dir_entry = readdir(dirp)) != NULL) {
+ /* strip out '.' and '..' */
+ if (strcmp(dir_entry->d_name, ".") &&
+ strcmp(dir_entry->d_name, "..")) {
+ fnew = (fnames *) ap_push_array(candidates);
+ fnew->fname = ap_make_full_path(p, fname, dir_entry->d_name);
+ }
+ }
+ ap_pclosedir(p, dirp);
+ if (candidates->nelts != 0) {
+ qsort((void *) candidates->elts, candidates->nelts,
+ sizeof(fnames), fname_alphasort);
+ /*
+ * Now recurse these... we handle errors and subdirectories
+ * via the recursion, which is nice
+ */
+ for (current = 0; current < candidates->nelts; ++current) {
+ fnew = &((fnames *) candidates->elts)[current];
+ fprintf(stderr, " Processing config file: %s\n", fnew->fname);
+ ap_process_resource_config(s, fnew->fname, p, ptemp);
+ }
+ }
+ return;
+ }
+
+ if (!(parms->config_file = ap_pcfg_openfile(p,fname))) {
+ perror("fopen");
+ fprintf(stderr, "%s: could not open document config file %s\n",
+ ap_server_argv0, fname);
+#ifdef NETWARE
+ clean_parent_exit(1);
+#else
+ exit(1);
+#endif
+ }
+
+ errmsg = ap_srm_command_loop(parms, s->lookup_defaults);
+
+ if (errmsg) {
+ fprintf(stderr, "Syntax error on line %d of %s:\n",
+ parms->config_file->line_number, parms->config_file->name);
+ fprintf(stderr, "%s\n", errmsg);
+#ifdef NETWARE
+ clean_parent_exit(1);
+#else
+ exit(1);
+#endif
+ }
+
+ ap_cfg_closefile(parms->config_file);
+}
+
+
CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp)
{
const char *errmsg;