From 312ef84deaa09fb63deb905c177d9b06c7b75fec Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Tue, 31 Jan 2012 17:32:50 +0000 Subject: [PATCH] Merge r1229021 from trunk: Core configuration: add AllowOverride option to treat syntax errors in .htaccess as non-fatal. PR 52439 Submitted by: niq Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1238698 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ docs/manual/mod/core.xml | 5 +++++ include/ap_mmn.h | 3 ++- include/http_config.h | 7 +++++++ include/http_core.h | 2 +- server/config.c | 34 +++++++++++++++++++++++++++------- server/core.c | 11 +++++++++++ 7 files changed, 56 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index fbbfcccc35..e9a1aeedea 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,9 @@ Changes with Apache 2.4.1 when no custom ErrorDocument is specified for status code 400. [Eric Covener] + *) Core configuration: add AllowOverride option to treat syntax + errors in .htaccess as non-fatal. PR 52439 [Nick Kew, Jim Jagielski] + *) core: Fix memory consumption in core output filter with streaming bucket types like CGI or PIPE. [Joe Orton, Stefan Fritsch] diff --git a/docs/manual/mod/core.xml b/docs/manual/mod/core.xml index edc0df35c4..264279ffbf 100644 --- a/docs/manual/mod/core.xml +++ b/docs/manual/mod/core.xml @@ -413,6 +413,11 @@ NoDecode option available in 2.3.12 and later. module="mod_authz_host">Deny and Order). +
Nonfatal
+ +
+ Allow use of AllowOverride option to treat syntax errors in .htaccess as non-fatal. +
Options[=Option,...]
diff --git a/include/ap_mmn.h b/include/ap_mmn.h index d3726ef562..7df163b7c7 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -383,12 +383,13 @@ * ap_proxy_sec2hex(), ap_proxy_make_fake_req(), * ap_proxy_strmatch_path, ap_proxy_strmatch_domain, * ap_proxy_table_unmerge(), proxy_lb_workers. + * 20120109.0 (2.4.1-dev) Changes sizeof(overrides_t) in core config. */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ #ifndef MODULE_MAGIC_NUMBER_MAJOR -#define MODULE_MAGIC_NUMBER_MAJOR 20111203 +#define MODULE_MAGIC_NUMBER_MAJOR 20120109 #endif #define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ diff --git a/include/http_config.h b/include/http_config.h index 30ec368594..951d64399a 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -242,6 +242,13 @@ struct command_struct { #define EXEC_ON_READ 256 /**< force directive to execute a command which would modify the configuration (like including another file, or IFModule */ +/* Flags to determine whether syntax errors in .htaccess should be + * treated as nonfatal (log and ignore errors) + */ +#define NONFATAL_OVERRIDE 512 /* Violation of AllowOverride rule */ +#define NONFATAL_UNKNOWN 1024 /* Unrecognised directive */ +#define NONFATAL_ALL (NONFATAL_OVERRIDE|NONFATAL_UNKNOWN) + /** this directive can be placed anywhere */ #define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES) diff --git a/include/http_core.h b/include/http_core.h index 81b36c7507..c4f4bacfa7 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -446,7 +446,7 @@ AP_DECLARE(void **) ap_get_request_note(request_rec *r, apr_size_t note_num); typedef unsigned char allow_options_t; -typedef unsigned char overrides_t; +typedef unsigned int overrides_t; /* * Bits of info that go into making an ETag for a file diff --git a/server/config.c b/server/config.c index 409ca0695a..96ab9c9d57 100644 --- a/server/config.c +++ b/server/config.c @@ -848,8 +848,19 @@ static const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms, if(apr_table_get(parms->override_list, cmd->name) != NULL) override_list_ok = 1; - if ((parms->override & cmd->req_override) == 0 && !override_list_ok) - return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL); + if ((parms->override & cmd->req_override) == 0 && !override_list_ok) { + if (parms->override & NONFATAL_OVERRIDE) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, parms->temp_pool, + APLOGNO(02295) + "%s in .htaccess forbidden by AllowOverride", + cmd->name); + return NULL; + } + else { + return apr_pstrcat(parms->pool, cmd->name, + " not allowed here", NULL); + } + } parms->info = cmd->cmd_data; parms->cmd = cmd; @@ -1251,11 +1262,20 @@ static const char *ap_walk_config_sub(const ap_directive_t *current, if (ml == NULL) { parms->err_directive = current; - return apr_pstrcat(parms->pool, "Invalid command '", - current->directive, - "', perhaps misspelled or defined by a module " - "not included in the server configuration", - NULL); + if (parms->override & NONFATAL_UNKNOWN) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, parms->temp_pool, + APLOGNO(02296) "Unknown directive %s " + "perhaps misspelled or defined by a module " + "not included in the server configuration", dir); + return NULL; + } + else { + return apr_pstrcat(parms->pool, "Invalid command '", + current->directive, + "', perhaps misspelled or defined by a module " + "not included in the server configuration", + NULL); + } } for ( ; ml != NULL; ml = ml->next) { diff --git a/server/core.c b/server/core.c index f0a29dd5d4..23537f5c0e 100644 --- a/server/core.c +++ b/server/core.c @@ -1619,6 +1619,17 @@ static const char *set_override(cmd_parms *cmd, void *d_, const char *l) else if (!strcasecmp(w, "Indexes")) { d->override |= OR_INDEXES; } + else if (!strcasecmp(w, "Nonfatal")) { + if (!strcasecmp(v, "Override")) { + d->override |= NONFATAL_OVERRIDE; + } + else if (!strcasecmp(v, "Unknown")) { + d->override |= NONFATAL_UNKNOWN; + } + else if (!strcasecmp(v, "All")) { + d->override |= NONFATAL_ALL; + } + } else if (!strcasecmp(w, "None")) { d->override = OR_NONE; } -- 2.40.0