Stas Bekman <[EMAIL PROTECTED]> writes:
[...]
> I was just adding a note to the API method doc saying:
>
> it's important to mention that at the end of each request where
> you modify this setting you absolutely must restore it to its
> original value.
>
> but it doesn't work, since the resetting will be allocated from the request
> pool, which will go away at the end of the request, leaving the data
> corrupted.
>
> So unless I miss something we have two options:
>
> 1) nuke that method completely
>
> 2) either provide a new method that restores the data using a preallocated
> string from the server pool or do that internally in the server
Why not add a request pool cleanup that just restores the original pointer?
struct docroot_info {
const char **docroot;
const char *original;
};
static apr_status_t restore_docroot(void *data)
{
struct docroot_info * di = data;
*di->docroot = original;
return APR_SUCCESS;
}
Then in the original XS...
struct docroot_info *di;
...
di = apr_palloc(r->pool, sizeof *di);
di->docroot = &conf->ap_document_root;
di->original = conf->ap_document_root;
apr_pool_cleanup_register(p, di, restore_docroot, restore_docroot);
conf->ap_document_root = apr_pstrdup(r->pool, SvPV_nolen(new_root));
--
Joe Schaefer