]> granicus.if.org Git - apache/commitdiff
Be extra careful to only pass the main server config to
authorStefan Fritsch <sf@apache.org>
Wed, 20 Oct 2010 19:53:57 +0000 (19:53 +0000)
committerStefan Fritsch <sf@apache.org>
Wed, 20 Oct 2010 19:53:57 +0000 (19:53 +0000)
ap_find_loaded_module_symbol. Fixes a segfault when using per-module
LogLevel on virtual host scope.

PR: 50117

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1025702 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
server/core.c

diff --git a/CHANGES b/CHANGES
index 2e3522dda450336a8f85f6f288ad173cd0278dec..1ed0f63c8383549369554c800753fc07eb569700 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,9 @@ Changes with Apache 2.3.9
      Fix a denial of service attack against mod_reqtimeout.
      [Stefan Fritsch]
 
+  *) core: Fix segfault if per-module LogLevel is on virtual host
+     scope. PR 50117. [Stefan Fritsch]
+
   *) mod_proxy: Move the ProxyErrorOverride directive to have per
      directory scope. [Graham Leggett]
 
index 50f82029f7eb5d4a79abe528c4bb62a0232ec5b0..b687e9e7ceb622d04cfa1973f43def08b5e9e730 100644 (file)
@@ -2059,7 +2059,23 @@ static module *find_module(server_rec *s, const char *name)
             APR_RETRIEVE_OPTIONAL_FN(ap_find_loaded_module_symbol);
 
         if (check_symbol) {
-            found = check_symbol(s, name);
+            /*
+             * There are two phases where calling ap_find_loaded_module_symbol
+             * is problematic:
+             *
+             * During reading of the config, ap_server_conf is invalid but s
+             * points to the main server config, if passed from cmd->server
+             * of an EXEC_ON_READ directive.
+             *
+             * During config parsing, s may be a virtual host that would cause
+             * a segfault in mod_so if passed to ap_find_loaded_module_symbol,
+             * because mod_so's server config for vhosts is initialized later.
+             * But ap_server_conf is already set at this time.
+             *
+             * Therefore we use s if it is not virtual and ap_server_conf if
+             * s is virtual.
+             */
+            found = check_symbol(s->is_virtual ? ap_server_conf : s, name);
         }
     }