httpd-modules-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Wortham" <djwort...@gmail.com>
Subject Whitescreens when using a dir-conf merge function
Date Wed, 07 Feb 2007 21:19:26 GMT
Hi all,
   I'm adding a merge function (for use with directory-based configuration
and server-based configuration).

When I finished the function, I noticed that it was causing whitescreens
(empty responses).

As you can see below, I allocate memory via 'apr_pcalloc' and then I:
(1) loop through each existing 'rbl_handler' from the parentdir_cfg, copying
it to the new_dir_cfg, then
(2) loop through each existing 'rbl_handler' from the subdir_cfg, copying it
to the new_dir_cfg.

With my current directive configuration, there are no directives to copy (so
the loops fail the first conditional and are never entered), but Apache
whitescreens nonetheless.  There are no errors or warnings on compile.

Am I allocating memory correctly, or perhaps my concept of merging (and when
the merge function is called) is bad?



The relevant code follows:

/* start code snippet */

// since memcpy was causing errors, I coded this function to do the same
(only much slower)
static void apr_copy_rbhlcpy(apr_pool_t* p, rbl_handler* from_rbl_handler,
rbl_handler* to_rbl_handler)
{
    if (from_rbl_handler)
    {
        to_rbl_handler->category_bs     = from_rbl_handler->category_bs;
        to_rbl_handler->score_lb        = from_rbl_handler->score_lb;
        to_rbl_handler->score_ub        = from_rbl_handler->score_ub;
        to_rbl_handler->days_lb         = from_rbl_handler->days_lb;
        to_rbl_handler->days_ub         = from_rbl_handler->days_ub;
        to_rbl_handler->verb_bs         = from_rbl_handler->verb_bs;
        to_rbl_handler->action_string   =
(from_rbl_handler->action_string)?apr_pstrdup(p,
from_rbl_handler->action_string):NULL;
    }
}

// the merge function
static void* my_merge_dir_conf (apr_pool_t* p, void* parent_dirv, void*
subdirv)
{
    httpbl_dir_cfg* parent_dir              = (httpbl_dir_cfg *)
parent_dirv;
    httpbl_dir_cfg* subdir                  = (httpbl_dir_cfg *) subdirv;
    httpbl_dir_cfg* new_dir_cfg             = (httpbl_dir_cfg *) apr_palloc
(p, sizeof(httpbl_dir_cfg));

    int             i                       = 0; // i = the
num_of_rbl_handlers already written in the new_dir_cfg array
    int             j                       = 0; // j = the
num_of_rbl_handlers read from from_rbl_handler
    new_dir_cfg->default_action             = subdir->default_action;
    new_dir_cfg->is_404_recording_enabled   =
subdir->is_404_recording_enabled;
    new_dir_cfg->is_exempt                  = subdir->is_exempt;
    new_dir_cfg->is_httpbl_enabled          = subdir->is_httpbl_enabled;
    new_dir_cfg->something                  =
(subdir->something)?apr_pstrdup(p, subdir->something):NULL;
    new_dir_cfg->the_rbl_handlers           = (rbl_handler **)apr_pcalloc(
p, (MAX_RBL_DIRECTIVES)*sizeof(rbl_handler*) );
    new_dir_cfg->num_of_rbl_handlers        = 0;

    rbl_handler*    from_rbl_handler;
    rbl_handler*    to_rbl_handler;
    // fill in rbl directives starting with the parent, then the child
(returning an error string if more than MAX_RBL_DIRECTIVES rbl_handlers are
created/attempted
    for (i = 0; i < parent_dir->num_of_rbl_handlers &&
new_dir_cfg->num_of_rbl_handlers <= MAX_RBL_DIRECTIVES; i++)
    {
        from_rbl_handler    = parent_dir->the_rbl_handlers[i];
        to_rbl_handler      = new_dir_cfg->the_rbl_handlers[i];

        if (from_rbl_handler)
        {
            apr_copy_rbhlcpy(p, from_rbl_handler, to_rbl_handler);
//            memcpy(to_rbl_handler, from_rbl_handler, sizeof(rbl_handler));
// try a direct memory copy
            (new_dir_cfg->num_of_rbl_handlers)++;
        }
    }
    for (j = 0; j < subdir->num_of_rbl_handlers &&
new_dir_cfg->num_of_rbl_handlers < MAX_RBL_DIRECTIVES; j++)
    {
        from_rbl_handler    = subdir->the_rbl_handlers[j];
        to_rbl_handler      = new_dir_cfg->the_rbl_handlers[i];

        if (from_rbl_handler)
        {
            apr_copy_rbhlcpy(p, from_rbl_handler, to_rbl_handler);
//            memcpy(to_rbl_handler, from_rbl_handler, sizeof(rbl_handler));
// try a direct memory copy
            (new_dir_cfg->num_of_rbl_handlers)++;
            i++;
        }
    }

    return new_dir_cfg;
}


/* end code snippet */

Dave

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message