diff options
author | Jim Jagielski <jim@apache.org> | 2017-05-23 12:48:27 +0000 |
---|---|---|
committer | Jim Jagielski <jim@apache.org> | 2017-05-23 12:48:27 +0000 |
commit | 5c6229bec764ccedffdc6c716b19e862169ae66d (patch) | |
tree | cba23e9023f311834c7713888cd93ae5b1a5d975 /server | |
parent | 54b5dedcb085aa0d0361d2376538ae4d12ac67c8 (diff) | |
download | httpd-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.c | 21 |
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. |