summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2017-05-23 12:48:27 +0000
committerJim Jagielski <jim@apache.org>2017-05-23 12:48:27 +0000
commit5c6229bec764ccedffdc6c716b19e862169ae66d (patch)
treecba23e9023f311834c7713888cd93ae5b1a5d975 /server
parent54b5dedcb085aa0d0361d2376538ae4d12ac67c8 (diff)
downloadhttpd-5c6229bec764ccedffdc6c716b19e862169ae66d.tar.gz
Merge r1792589 from trunk:
Evaluate nested If/ElseIf/Else config sections It has been reported multiple times that nested If/ElseIf/Else sections are not evaluated but silently ignored. This patch adds a simple recursion to the ap_if_walk logic in order to allow arbitrary nested configs. The overhead seems negligible compared to the actual version of the ap_if_walk, but more expert feedback is surely needed since this code gets called for every HTTP request. Tests are going to be added to t/apache/if_sections.t Submitted by: elukey Reviewed by: elukey, jim, yalvic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1795906 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'server')
-rw-r--r--server/request.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/server/request.c b/server/request.c
index 9377836e0f..b2280cb5a8 100644
--- a/server/request.c
+++ b/server/request.c
@@ -1777,10 +1777,9 @@ AP_DECLARE(int) ap_file_walk(request_rec *r)
return OK;
}
-AP_DECLARE(int) ap_if_walk(request_rec *r)
+static int ap_if_walk_sub(request_rec *r, core_dir_config* dconf)
{
ap_conf_vector_t *now_merged = NULL;
- core_dir_config *dconf = ap_get_core_module_config(r->per_dir_config);
ap_conf_vector_t **sec_ent = NULL;
int num_sec = 0;
walk_cache_t *cache;
@@ -1791,7 +1790,7 @@ AP_DECLARE(int) ap_if_walk(request_rec *r)
int prev_result = -1;
walk_walked_t *last_walk;
- if (dconf->sec_if) {
+ if (dconf && dconf->sec_if) {
sec_ent = (ap_conf_vector_t **)dconf->sec_if->elts;
num_sec = dconf->sec_if->nelts;
}
@@ -1906,9 +1905,25 @@ AP_DECLARE(int) ap_if_walk(request_rec *r)
}
cache->per_dir_result = r->per_dir_config;
+ if (now_merged) {
+ core_dir_config *dconf_merged = ap_get_core_module_config(now_merged);
+
+ /* Allow nested <If>s and their configs to get merged
+ * with the current one.
+ */
+ return ap_if_walk_sub(r, dconf_merged);
+ }
+
return OK;
}
+AP_DECLARE(int) ap_if_walk(request_rec *r)
+{
+ core_dir_config *dconf = ap_get_core_module_config(r->per_dir_config);
+ int status = ap_if_walk_sub(r, dconf);
+ return status;
+}
+
/*****************************************************************
*
* The sub_request mechanism.