Hi everyone,

I am new to apache development and I need some help with this issue please.

I have a configuration directive (ArcMaxRequestSize) in httpd.conf at the top level which makes apache segfault in the start-up phase when using my module.
It seems to me that only per-dir config is taken into account which seems really weird ...

I'm using  AP_INIT_TAKE1  and  ap_set_int_slot (see below). 

    AP_INIT_TAKE1("ArcMaxRequestSize", ap_set_int_slot,
            (void *)APR_OFFSETOF(arc_config_t, max_request_size), RSRC_CONF,
            "Maximum size of a request"),


The segmentation fault occurs in ap_set_int_slot because its struct_ptr parameter is NULL:

1436    AP_DECLARE_NONSTD(const char *) ap_set_int_slot(cmd_parms *cmd,
1437                                                    void *struct_ptr,
1438                                                    const char *arg)
1439    {
1440        char *endptr;
1441        char *error_str = NULL;
1442        int offset = (int)(long)cmd->info;
1443
  > 1444        *(int *)((char*)struct_ptr + offset) = strtol(arg, &endptr, 10);
1445
1446        if ((*arg == '\0') || (*endptr != '\0')) {

The stack looks like this:
#0  0x0808e2bf in ap_set_int_slot (cmd=0xbffff3a8, struct_ptr=0x0, arg=0x8198df0 "22222") at config.c:1444
#1  0x0808cfab in invoke_cmd (cmd=0xb7abe5e0, parms=0xbffff3a8, mconfig=0x0, args=0x8147965 "") at config.c:909
#2  0x0808df8e in ap_walk_config_sub (current=0x8147938, parms=0xbffff3a8, section_vector=0x810cf90) at config.c:1298
#3  0x0808e020 in ap_walk_config (current=0x8147938, parms=0xbffff3a8, section_vector=0x810cf90) at config.c:1331
#4  0x0808f326 in ap_process_config_tree (s=0x810be20, conftree=0x8138c00, p=0x80d50a8, ptemp=0x8135aa0) at config.c:2055
#5  0x080690d8 in main (argc=2, argv=0xbffff564) at main.c:639

In ap_walk_config_sub (stack#2) we have :

1284     for ( ; ml != NULL; ml = ml->next) {
1285         void *dir_config = ap_set_config_vectors(parms->server,
1286                                                  section_vector,
1287                                                  parms->path,
1288                                                  ml->m,
1289                                                  parms->pool);
1290         const char *retval;
1291         cmd = ml->cmd;
1292
1293         /* Once was enough? */
1294         if (cmd->req_override & EXEC_ON_READ) {
1295             continue;
1296         }
1297
1298         retval = invoke_cmd(cmd, parms, dir_config, current->args);

ap_set_config_vectors returns NULL here. Looking inside it I have the feeling that the server config is ignored and only the per-directory config is returned and in my case this is NULL:

in server/config.c :
1052 AP_CORE_DECLARE(void *) ap_set_config_vectors(server_rec *server,
1053                                               ap_conf_vector_t *section_vector,
1054                                               const char *section,
1055                                               module *mod, apr_pool_t *pconf)
1056 {
1057     void *section_config = ap_get_module_config(section_vector, mod);
1058     void *server_config = ap_get_module_config(server->module_config, mod);
1059
1060     if (!section_config && mod->create_dir_config) {
1061         /* ### need to fix the create_dir_config functions' prototype... */
1062         section_config = (*mod->create_dir_config)(pconf, (char *)section);
1063         ap_set_module_config(section_vector, mod, section_config);
1064     }
1065
1066     if (!server_config && mod->create_server_config) {
1067         server_config = (*mod->create_server_config)(pconf, server);
1068         ap_set_module_config(server->module_config, mod, server_config);
1069     }
1070
1071     return section_config;
1072 }


If I modiffy this to:

1068         ap_set_module_config(server->module_config, mod, server_config);
1069     }
1070    if(NULL == section_config)
1071        return server_config;
1072    return section_config;
1073 }

then everything works fine and as (I) expected.

I took some screenshots from my debugging session which can be found here:
http://www.crivat.eu/wp-content/uploads/2012/08/1.png
http://www.crivat.eu/wp-content/uploads/2012/08/2.png
http://www.crivat.eu/wp-content/uploads/2012/08/3_Boum_.png

Thanks in advance for your help,
Alex


=============== BEGIN mod_arc.c (extract) =========================
static void *arc_perserver_create_config(apr_pool_t *pool, server_rec *s)
{
    arc_config_t *conf = apr_pcalloc(pool, sizeof(arc_config_t));
    return conf;
}


static const command_rec arc_config_directives[] =
{
    AP_INIT_TAKE1("ArcMaxRequestSize", ap_set_int_slot,
            (void *)APR_OFFSETOF(arc_config_t, max_request_size), RSRC_CONF,
            "Maximum size of a request"),
    {NULL}
};


module AP_MODULE_DECLARE_DATA arc_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,        /* create per-dir    config structures */
    NULL,         /* merge  per-dir    config structures */
    arc_perserver_create_config,     /* create per-server config structures */
    NULL,      /* merge  per-server config structures */
    arc_config_directives,           /* table of config file commands       */
    arc_register_hooks               /* register hooks                      */
};
=============== END mod_arc.c (extract) ===========================

=============== BEGIN httpd.conf (extract)  =========================
LoadModule arc_module modules/mod_arc.so
ArcMaxRequestSize 22222
<Location /arc>
    SetHandler arc
</Location>
=============== END httpd.conf (extract)  ===========================