Hi,
I have gone through your code quickly. It seems there is some problem in
your merge function:
rbl_handler* from_rbl_handler;
rbl_handler* to_rbl_handler;
here you haven't pcalloc the memory for it. However late you pass these
pointers to the function:
static void apr_copy_rbhlcpy(apr_pool_t* p, rbl_handler*
from_rbl_handler,
rbl_handler* to_rbl_handler)
In this function you use pointer to accept parmaters. Should you use double
pointer?(e.g.rbl_handler* from_rbl_handler). My suggestion is that you
allocate the memory in your merge function and then in apr_copy_rbhlcpy try
to use double pointer.
I am not so sure whether it is the reason. but you can have a try.
br
frankie
From: "David Wortham" <[EMAIL PROTECTED]>
Reply-To: [email protected]
To: [email protected]
Subject: Whitescreens when using a dir-conf merge function
Date: Wed, 7 Feb 2007 14:19:26 -0700
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
_________________________________________________________________
与联机的朋友进行交流,请使用 Live Messenger;
http://get.live.com/messenger/overview