summaryrefslogtreecommitdiff
path: root/modules/core
diff options
context:
space:
mode:
authorStefan Fritsch <sf@apache.org>2012-04-30 20:50:45 +0000
committerStefan Fritsch <sf@apache.org>2012-04-30 20:50:45 +0000
commit5d010bf77c0c176180aeec596fcbb1d4648d5765 (patch)
treea31374bded39c6b25735d5fe5d97d93df47993bd /modules/core
parentfecfcee26cacf1180c10190a9ecde6e94ef17ee3 (diff)
downloadhttpd-5d010bf77c0c176180aeec596fcbb1d4648d5765.tar.gz
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. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1332378 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/core')
-rw-r--r--modules/core/mod_so.c77
1 files changed, 43 insertions, 34 deletions
diff --git a/modules/core/mod_so.c b/modules/core/mod_so.c
index 13ecd9634b..6df596a900 100644
--- a/modules/core/mod_so.c
+++ b/modules/core/mod_so.c
@@ -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;
}