]> granicus.if.org Git - apache/commitdiff
Clear hook registrations between reads of the config file.
authorAllan K. Edwards <ake@apache.org>
Thu, 23 Mar 2000 14:48:45 +0000 (14:48 +0000)
committerAllan K. Edwards <ake@apache.org>
Thu, 23 Mar 2000 14:48:45 +0000 (14:48 +0000)
When DSOs are unloaded and re-loaded the old hook pointers may
no longer be valid. This fix eliminates potential segfaults.

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

include/http_config.h
server/config.c
server/main.c

index 79ccd6c34cd0c41e997d30f22cdfad835c9e554d..ccc7e21d91811e846fe1b8cb0ad6eaf321cff75c 100644 (file)
@@ -329,6 +329,8 @@ void ap_show_modules(void);
 server_rec *ap_read_config(process_rec *process, ap_context_t *temp_pool, const char *config_name);
 void ap_post_config_hook(ap_context_t *pconf, ap_context_t *plog, ap_context_t *ptemp, server_rec *s);
 void ap_child_init_hook(ap_context_t *pchild, server_rec *s);
+void ap_register_hooks(module *m);
+void ap_hook_deregister_all(void);
 
 /* For http_request.c... */
 
index 266463cee931c6741819f2f799810224cab287af..ad25e54859331937ee4cc720fe4bb7ad35d869d4 100644 (file)
@@ -360,7 +360,7 @@ int ap_invoke_handler(request_rec *r)
 int g_bDebugHooks;
 const char *g_szCurrentHookName;
 
-static void register_hooks(module *m)
+void ap_register_hooks(module *m)
     {
     if(m->register_hooks)
        {
@@ -430,7 +430,7 @@ API_EXPORT(void) ap_add_module(module *m)
 #endif /*_OSD_POSIX*/
 
     /* FIXME: is this the right place to call this? */
-    register_hooks(m);
+    ap_register_hooks(m);
 }
 
 /* 
index 94c835e018ddd5c7eb15ac47a4c1ce8adc93c57a..44e0828ac039638674c91cfdb6d86f08b12219d2 100644 (file)
@@ -296,6 +296,7 @@ API_EXPORT_NONSTD(int)        main(int argc, char *argv[])
     ap_context_t *plog; /* Pool of log streams, reset _after_ each read of conf */
     ap_context_t *ptemp; /* Pool for temporary config stuff, reset often */
     ap_context_t *pcommands; /* Pool for -C and -c switches */
+    module **mod;
 
     ap_initialize();
     process = create_process(argc, (const char **)argv);
@@ -305,7 +306,7 @@ API_EXPORT_NONSTD(int)        main(int argc, char *argv[])
     
     ap_util_uri_init();
 
-    g_pHookPool=pglobal;
+    g_pHookPool=pconf;
 
     ap_setup_prelinked_modules(process);
 
@@ -375,7 +376,11 @@ API_EXPORT_NONSTD(int)        main(int argc, char *argv[])
     ap_destroy_pool(ptemp);
 
     for (;;) {
+       ap_hook_deregister_all();
        ap_clear_pool(pconf);
+       for (mod = ap_prelinked_modules; *mod != NULL; mod++) {
+               ap_register_hooks(*mod);
+       }
        ap_create_context(&ptemp, pconf);
        ap_server_root = def_server_root;
        ap_run_pre_config(pconf, plog, ptemp);