Commit effbc621 authored by Allan K. Edwards's avatar Allan K. Edwards
Browse files

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
parent d22cfb41
Loading
Loading
Loading
Loading
+2 −0
Changes for include/http_config.h: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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... */

+2 −2
Changes for server/config.c: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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);
}

/* 
+6 −1
Changes for server/main.c: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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);