From: William A. Rowe Jr Date: Sat, 10 Nov 2001 19:01:29 +0000 (+0000) Subject: Prevent an Apache module from being loaded or added twice due X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd961ff0dd05f73206bb97a692470d06ed60466e;p=thirdparty%2Fapache%2Fhttpd.git Prevent an Apache module from being loaded or added twice due to duplicate LoadModule or AddModule directives (or a missing ClearModuleList directive). LoadModule dupcheck (for 2.0) by Brian Pane Ported and added AddModule dupcheck by Will Rowe Identified by an old collegue of Will's who tripped over this. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x@91836 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/CHANGES b/src/CHANGES index 7b05390628a..e5383c851d0 100644 --- a/src/CHANGES +++ b/src/CHANGES @@ -1,5 +1,10 @@ Changes with Apache 1.3.23 + *) Prevent an Apache module from being loaded or added twice due + to duplicate LoadModule or AddModule directives (or a missing + ClearModuleList directive). + [William Rowe, Brian Pane ] + *) Add checkgid app to do run-time validation of Group directive values which might cause the server to fall over, but which are syntactically correct. [Ken Coar] diff --git a/src/main/http_core.c b/src/main/http_core.c index e845f1a96d1..a5ba80ecbe8 100644 --- a/src/main/http_core.c +++ b/src/main/http_core.c @@ -1908,11 +1908,20 @@ static const char *set_server_alias(cmd_parms *cmd, void *dummy, static const char *add_module_command(cmd_parms *cmd, void *dummy, char *arg) { + module *modp; const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); if (err != NULL) { return err; } + for (modp = top_module; modp; modp = modp->next) { + if (modp->name != NULL && strcmp(modp->name, arg) == 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, cmd->server, + "module %s is already added, skipping", arg); + return NULL; + } + } + if (!ap_add_named_module(arg)) { return ap_pstrcat(cmd->pool, "Cannot add module via name '", arg, "': not in list of loaded modules", NULL); diff --git a/src/modules/standard/mod_so.c b/src/modules/standard/mod_so.c index 49c4ade8a90..e5bd0f375d9 100644 --- a/src/modules/standard/mod_so.c +++ b/src/modules/standard/mod_so.c @@ -231,8 +231,11 @@ static const char *load_module(cmd_parms *cmd, void *dummy, modie = (moduleinfo *)sconf->loaded_modules->elts; for (i = 0; i < sconf->loaded_modules->nelts; i++) { modi = &modie[i]; - if (modi->name != NULL && strcmp(modi->name, modname) == 0) + if (modi->name != NULL && strcmp(modi->name, modname) == 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, cmd->server, + "module %s is already loaded, skipping", modname); return NULL; + } } modi = ap_push_array(sconf->loaded_modules); modi->name = modname;