Return-Path: Delivered-To: apache-cvs-archive@hyperreal.org Received: (qmail 9707 invoked by uid 6000); 25 Mar 1998 09:44:53 -0000 Received: (qmail 9701 invoked by alias); 25 Mar 1998 09:44:52 -0000 Delivered-To: apache-1.3-cvs@hyperreal.org Received: (qmail 9698 invoked by uid 168); 25 Mar 1998 09:44:49 -0000 Date: 25 Mar 1998 09:44:49 -0000 Message-ID: <19980325094449.9697.qmail@hyperreal.org> From: rse@hyperreal.org To: apache-1.3-cvs@hyperreal.org Subject: cvs commit: apache-1.3/src/modules/standard mod_so.c Sender: apache-cvs-owner@apache.org Precedence: bulk Reply-To: new-httpd@apache.org rse 98/03/25 01:44:49 Modified: . STATUS src CHANGES src/modules/standard mod_so.c Log: Make shared object loading work again (now that -DHIDE is the default). Distributed modules are loaded with AP__module and custom modules are now loaded with the fallback strategy via _module (because their _module is not and canno be hidden by hide.h). Revision Changes Path 1.205 +2 -0 apache-1.3/STATUS Index: STATUS =================================================================== RCS file: /export/home/cvs/apache-1.3/STATUS,v retrieving revision 1.204 retrieving revision 1.205 diff -u -r1.204 -r1.205 --- STATUS 1998/03/23 07:42:09 1.204 +++ STATUS 1998/03/25 09:44:44 1.205 @@ -102,6 +102,8 @@ * Ralf's reanim. of undocum. directive: ProxyReceiveBufferSize, PR#1348 * Ralf's mod_proxy fix to use FTP SIZE response for Content-Length, PR#1183 * Ralf's change to make the shared object compilation command more portable + * Dean's protect against FD_SETSIZE mismatches + * Ralf's fallback stategy because of HIDE for loading shared object modules Available Patches: 1.731 +5 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.730 retrieving revision 1.731 diff -u -r1.730 -r1.731 --- CHANGES 1998/03/25 02:57:19 1.730 +++ CHANGES 1998/03/25 09:44:46 1.731 @@ -1,4 +1,9 @@ Changes with Apache 1.3b6 + + *) Finally fix the shared object loading by using a fallback strategy to + overcome the HIDE feature problematic without loosing special cases. Also + a huge comment was added to mod_so.c to make the situation more clear + for the future. [Ralf S. Engelschall] *) Protect against FD_SETSIZE mismatches. [Dean Gaudet] 1.15 +66 -9 apache-1.3/src/modules/standard/mod_so.c Index: mod_so.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_so.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- mod_so.c 1998/03/23 15:44:15 1.14 +++ mod_so.c 1998/03/25 09:44:48 1.15 @@ -222,6 +222,7 @@ so_server_conf *sconf; moduleinfo *modi; moduleinfo *modie; + char *modname_hidden; int i; /* @@ -240,7 +241,53 @@ modi->name = modname; /* - * Actually load the file into the address space + * NOW COMES THE PROBLEMATIC PART: + * + * Because of the -DHIDE/hide.h feature of Apache 1.3 we have eight + * situations from which four doesn't work at all and four are a bit + * different because of the AP_ hiding stuff and the fact that this symbol + * hiding applies only to distributed modules. + * + * Apache ...... means the Apache code itself + * S-Module .... means a standard module which is distributed with Apache + * C-Module .... means a custom module which is not distributed with Apache + * HIDE ........ means -DHIDE was used when compiling + * !HIDE ....... means -DHIDE was not used when compiling + * xxx ......... means the symbol "_module" of the module structure + * + * Resolving| dlopen() dlsym() + * | (implicit) (explicit) + * Situation | core->module core<-module + * ------------------------------+----------------------------------- + * The compatible variants: | + * Apache+!HIDE & S-Module+!HIDE | succeeds succeeds only w/ xxx + * Apache+ HIDE & S-Module+ HIDE | succeeds succeeds only w/ AP_xxx + * Apache+!HIDE & C-Module+!HIDE | succeeds succeeds only w/ xxx + * Apache+ HIDE & C-Module+ HIDE | succeeds succeeds only w/ xxx <<== + * The incompatible variants: | + * Apache+!HIDE & S-Module+ HIDE | fails would succeed w/ AP_xxx + * Apache+ HIDE & S-Module+!HIDE | fails would succeed w/ xxx + * Apache+!HIDE & C-Module+ HIDE | fails would succeed w/ xxx + * Apache+ HIDE & C-Module+!HIDE | fails would succeed w/ xxx + * + * In other words: For the incompatible variants where the Apache core was + * built with a different setting than the ones the module was compiled + * with, we have no chance at all because the implicit resolving of + * Apache's core symbols in dlopen() already fails for the module (because + * for instance the module needs palloc while Apache exports AP_palloc). + * + * So, only for the compatible variants we have a chance. And here we + * succeed by always trying to resolve the plain xxx symbol and only for + * the case of a distributed standard module we have to resolve via the + * AP_xxx variant. Because we cannot decide if the module to be loaded is + * a distributed one or a custom one we really have to try both: First for + * AP_xxx and if this fails additionally for xxx. + * + * -- rse + */ + + /* + * Load the file into the Apache address space */ if (!(modhandle = os_dl_load(szModuleFile))) { const char *my_error = os_dl_error(); @@ -252,21 +299,31 @@ aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL, "loaded module %s", modname); -#ifdef HIDE - modname = pstrcat(cmd->pool, "AP_", modname, NULL); -#endif + /* + * Create the symbol variant for the case where + * we have to load a distributed module compiled with -DHIDE + */ + modname_hidden = pstrcat(cmd->pool, "AP_", modname, NULL); + /* + * Optionally prefix the symbol with an underscore + * for some platforms. + */ #ifdef NEED_UNDERSCORE_SYM + modname_hidden = pstrcat(cmd->pool, "_", modname_hidden, NULL); modname = pstrcat(cmd->pool, "_", modname, NULL); #endif /* - * Retrieve the pointer to the module structure - * through the module name + * Retrieve the pointer to the module structure through the module name: + * First with the hidden variant (prefix `AP_') and then with the plain + * symbol name. */ - if (!(modp = (module *)(os_dl_sym (modhandle, modname)))) { - return pstrcat(cmd->pool, "Can't find module ", modname, - " in file ", filename, ":", os_dl_error(), NULL); + if (!(modp = (module *)(os_dl_sym (modhandle, modname_hidden)))) { + if (!(modp = (module *)(os_dl_sym (modhandle, modname)))) { + return pstrcat(cmd->pool, "Can't find module ", modname, + " in file ", filename, ":", os_dl_error(), NULL); + } } modi->modp = modp; modp->dynamic_load_handle = modhandle;