]> granicus.if.org Git - apache/commitdiff
mod_lua: Add a fixups hook that checks if the original request is intended
authorDaniel Gruno <humbedooh@apache.org>
Thu, 13 Mar 2014 12:55:53 +0000 (12:55 +0000)
committerDaniel Gruno <humbedooh@apache.org>
Thu, 13 Mar 2014 12:55:53 +0000 (12:55 +0000)
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
modules/lua/mod_lua.c

diff --git a/CHANGES b/CHANGES
index 75625765c6181a935a8140b9b8dfee86a0c3fb7c..becf74ba8b1b0a516402fb9c2af5d3c1459d71fc 100644 (file)
--- 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)
index 3eda5fc1a28a715cbbb9d993cf41670870c97775..8f09cfe1fb2879ac19e297c3bc886508fb0f0278 100644 (file)
@@ -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