Hi, as an experiment to see if the segfault I am currently debugging were caused by my modifications I found this. Httpd segfaults if its startup is aborted because the DYNAMIC_MODULE_LIMIT is hit. The reason is that the module that caused the abort is first unloaded as dso and then used in ap_remove_module as ap_top_module. Unfortunately, the memory segment where the module is located is already wiped from the process' address space at the time.
This happens because both apr_dso_load and mod_so:load_module register a pool cleanup to undo their effects. These cleanup functions are called in the wrong order. I see 2 ways how to prevent that: 1) change in mod_so.c line 305 from apr_pool_cleanup_register(cmd->pool, modi, unload_module, apr_pool_cleanup_null); to apr_pool_pre_cleanup_register(cmd->pool, modi, unload_module); This way ap_remove_module will be called before the dso is unloaded. 2) check for possible errors in ap_add_module() before performing any changes: @@ -541,16 +565,11 @@ m->name, m->version, MODULE_MAGIC_NUMBER_MAJOR); } - if (m->next == NULL) { - m->next = ap_top_module; - ap_top_module = m; - } - if (m->module_index == -1) { m->module_index = total_modules++; dynamic_modules++; if (dynamic_modules > DYNAMIC_MODULE_LIMIT) { return apr_psprintf(p, "Module \"%s\" could not be loaded, " "because the dynamic module limit was " "reached. Please increase " @@ -568,6 +587,13 @@ } } + if (m->next == NULL) { + m->next = ap_top_module; + ap_top_module = m; + } + if (sym_name) { int len = strlen(sym_name); int slen = strlen("_module"); Torsten Förtsch -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net