From 789a32d2f14f96c32d05d538e2c6fc0a0e65609e Mon Sep 17 00:00:00 2001 From: "Allan K. Edwards" Date: Thu, 23 Mar 2000 14:48:45 +0000 Subject: [PATCH] Clear hook registrations between reads of the config file. 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 | 2 ++ server/config.c | 4 ++-- server/main.c | 7 ++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/http_config.h b/include/http_config.h index 79ccd6c34c..ccc7e21d91 100644 --- a/include/http_config.h +++ b/include/http_config.h @@ -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... */ diff --git a/server/config.c b/server/config.c index 266463cee9..ad25e54859 100644 --- a/server/config.c +++ b/server/config.c @@ -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); } /* diff --git a/server/main.c b/server/main.c index 94c835e018..44e0828ac0 100644 --- a/server/main.c +++ b/server/main.c @@ -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); -- 2.50.1