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

Reply via email to