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