From 31b2c080a0285a6cb2a1bc0a01a5ea59102c9a1e Mon Sep 17 00:00:00 2001 From: Daniel Gruno Date: Thu, 13 Mar 2014 12:55:53 +0000 Subject: [PATCH] mod_lua: Add a fixups hook that checks if the original request is intended for LuaMapHandler. This fixes a bug where FallbackResource invalidates the LuaMapHandler directive in certain cases by changing the URI before the map handler code executes [Daniel Gruno]. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1577145 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 5 +++++ modules/lua/mod_lua.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/CHANGES b/CHANGES index 75625765c6..becf74ba8b 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,11 @@ Changes with Apache 2.4.9 would cause a crash in SSL_get_certificate for servers where the certificate hadn't been sent. [Stephen Henson] + *) mod_lua: Add a fixups hook that checks if the original request is intended + for LuaMapHandler. This fixes a bug where FallbackResource invalidates the + LuaMapHandler directive in certain cases by changing the URI before the map + handler code executes [Daniel Gruno]. + Changes with Apache 2.4.8 *) SECURITY: CVE-2014-0098 (cve.mitre.org) diff --git a/modules/lua/mod_lua.c b/modules/lua/mod_lua.c index 3eda5fc1a2..8f09cfe1fb 100644 --- a/modules/lua/mod_lua.c +++ b/modules/lua/mod_lua.c @@ -709,6 +709,29 @@ static int lua_request_rec_hook_harness(request_rec *r, const char *name, int ap return DECLINED; } +static int lua_map_handler_fixups(request_rec *r) +{ + /* If there is no handler set yet, this might be a LuaMapHandler request */ + if (r->handler == NULL) { + int n = 0; + ap_regmatch_t match[10]; + const ap_lua_dir_cfg *cfg = ap_get_module_config(r->per_dir_config, + &lua_module); + for (n = 0; n < cfg->mapped_handlers->nelts; n++) { + ap_lua_mapped_handler_spec *hook_spec = + ((ap_lua_mapped_handler_spec **) cfg->mapped_handlers->elts)[n]; + + if (hook_spec == NULL) { + continue; + } + if (!ap_regexec(hook_spec->uri_pattern, r->uri, 10, match, 0)) { + r->handler = apr_pstrdup(r->pool, "lua-map-handler"); + return OK; + } + } + } + return DECLINED; +} static int lua_map_handler(request_rec *r) { @@ -2032,6 +2055,8 @@ static void lua_register_hooks(apr_pool_t *p) APR_OPTIONAL_HOOK(ap_lua, lua_request, lua_request_hook, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_handler(lua_map_handler, NULL, NULL, AP_LUA_HOOK_FIRST); + /* Hook this right before FallbackResource kicks in */ + ap_hook_fixups(lua_map_handler_fixups, NULL, NULL, AP_LUA_HOOK_LAST-2); #if APR_HAS_THREADS ap_hook_child_init(ap_lua_init_mutex, NULL, NULL, APR_HOOK_MIDDLE); #endif -- 2.50.1