]> granicus.if.org Git - apache/commitdiff
Merge r1332378 from trunk:
authorJim Jagielski <jim@apache.org>
Mon, 23 Jul 2012 12:17:18 +0000 (12:17 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 23 Jul 2012 12:17:18 +0000 (12:17 +0000)
If a filename without slashes is specified for LoadFile or
LoadModule and the file cannot be found in the server root directory,
try to use the standard dlopen() search path.

Submitted by: sf
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1364603 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
modules/core/mod_so.c

diff --git a/CHANGES b/CHANGES
index 1daee9c5b980a028e8526563ac161d1ae3985825..9083686eb4385d9c7e1e3e3f927247c4111fdc4b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,10 @@ Changes with Apache 2.4.3
      possible XSS for a site where untrusted users can upload files to
      a location with MultiViews enabled. [Niels Heinen <heinenn google.com>]
 
+  *) mod_so: If a filename without slashes is specified for LoadFile or
+     LoadModule and the file cannot be found in the server root directory,
+     try to use the standard dlopen() search path. [Stefan Fritsch]
+
   *) core: Log value of Status header line in script responses rather
      than the fixed header name.  [Chris Darroch]
 
diff --git a/STATUS b/STATUS
index 1f574cf0872fa0306443bc12b3294d79b79ab005..ecde788a6bae04dd07a4d957c2495abde36c2b76 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -88,11 +88,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-   * mod_so: Optionally allow LoadModule+LoadFile to use the normal search path.
-     trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1332378
-     2.4.x patch: trunk patch works (ex. CHANGES)
-     +1: sf, rjung, jim
-
    * mpm_event: Fix slots staying in "L" state in the scoreboard
      trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1294349
      2.4.x patch: trunk patch works (needs CHANGES entry)
index 13ecd9634bfdceaf2bdf12cdf8237e869417bfd0..6df596a900908b00905c39e03e10fd028109aab7 100644 (file)
@@ -143,6 +143,37 @@ static apr_status_t unload_module(void *data)
     return APR_SUCCESS;
 }
 
+static const char *dso_load(cmd_parms *cmd, apr_dso_handle_t **modhandlep,
+                            const char *filename, const char **used_filename)
+{
+    int retry = 0;
+    const char *fullname = ap_server_root_relative(cmd->temp_pool, filename);
+    char my_error[256];
+    if (filename != NULL && ap_strchr_c(filename, '/') == NULL) {
+        /* retry on error without path to use dlopen()'s search path */
+        retry = 1;
+    }
+
+    if (fullname == NULL && !retry) {
+        return apr_psprintf(cmd->temp_pool, "Invalid %s path %s",
+                            cmd->cmd->name, filename);
+    }
+    *used_filename = fullname;
+    if (apr_dso_load(modhandlep, fullname, cmd->pool) == APR_SUCCESS) {
+        return NULL;
+    }
+    if (retry) {
+        *used_filename = filename;
+        if (apr_dso_load(modhandlep, filename, cmd->pool) == APR_SUCCESS)
+            return NULL;
+    }
+
+    return apr_pstrcat(cmd->temp_pool, "Cannot load ", filename,
+                        " into server: ",
+                        apr_dso_error(*modhandlep, my_error, sizeof(my_error)),
+                        NULL);
+}
+
 /*
  * This is called for the directive LoadModule and actually loads
  * a shared object file into the address space of the server process.
@@ -154,7 +185,7 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
     apr_dso_handle_t *modhandle;
     apr_dso_handle_sym_t modsym;
     module *modp;
-    const char *szModuleFile = ap_server_root_relative(cmd->pool, filename);
+    const char *module_file;
     so_server_conf *sconf;
     ap_module_symbol_t *modi;
     ap_module_symbol_t *modie;
@@ -167,11 +198,6 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
      */
     *(ap_directive_t **)dummy = NULL;
 
-    if (!szModuleFile) {
-        return apr_pstrcat(cmd->pool, "Invalid LoadModule path ",
-                           filename, NULL);
-    }
-
     /*
      * check for already existing module
      * If it already exists, we have nothing to do
@@ -234,16 +260,11 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
     /*
      * Load the file into the Apache address space
      */
-    if (apr_dso_load(&modhandle, szModuleFile, cmd->pool) != APR_SUCCESS) {
-        char my_error[256];
-
-        return apr_pstrcat(cmd->pool, "Cannot load ", szModuleFile,
-                          " into server: ",
-                          apr_dso_error(modhandle, my_error, sizeof(my_error)),
-                          NULL);
-    }
+    error = dso_load(cmd, &modhandle, filename, &module_file);
+    if (error)
+        return error;
     ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, cmd->pool, APLOGNO(01575)
-                 "loaded module %s", modname);
+                 "loaded module %s from %s", modname, module_file);
 
     /*
      * Retrieve the pointer to the module structure through the module name:
@@ -254,7 +275,7 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
         char my_error[256];
 
         return apr_pstrcat(cmd->pool, "Can't locate API module structure `",
-                          modname, "' in file ", szModuleFile, ": ",
+                          modname, "' in file ", module_file, ": ",
                           apr_dso_error(modhandle, my_error, sizeof(my_error)),
                           NULL);
     }
@@ -271,7 +292,7 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
                             "is garbled - expected signature %08lx but saw "
                             "%08lx - perhaps this is not an Apache module DSO, "
                             "or was compiled for a different Apache version?",
-                            modname, szModuleFile,
+                            modname, module_file,
                             MODULE_MAGIC_COOKIE, modp->magic);
     }
 
@@ -306,26 +327,14 @@ static const char *load_module(cmd_parms *cmd, void *dummy,
 static const char *load_file(cmd_parms *cmd, void *dummy, const char *filename)
 {
     apr_dso_handle_t *handle;
-    const char *file;
-
-    file = ap_server_root_relative(cmd->pool, filename);
+    const char *used_file, *error;
 
-    if (!file) {
-        return apr_pstrcat(cmd->pool, "Invalid LoadFile path ",
-                           filename, NULL);
-    }
-
-    if (apr_dso_load(&handle, file, cmd->pool) != APR_SUCCESS) {
-        char my_error[256];
-
-        return apr_pstrcat(cmd->pool, "Cannot load ", filename,
-                          " into server: ",
-                          apr_dso_error(handle, my_error, sizeof(my_error)),
-                          NULL);
-    }
+    error = dso_load(cmd, &handle, filename, &used_file);
+    if (error)
+        return error;
 
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, APLOGNO(01576)
-                 "loaded file %s", filename);
+                 "loaded file %s", used_file);
 
     return NULL;
 }