Author: joes Date: Wed Mar 2 15:14:28 2005 New Revision: 155973 URL: http://svn.apache.org/viewcvs?view=rev&rev=155973 Log:
If $r->document_root was modified, restore it at the end of request. Reviewed by: joes Written by: stas Modified: perl/modperl/trunk/Changes perl/modperl/trunk/t/response/TestModperl/setupenv.pm perl/modperl/trunk/todo/release perl/modperl/trunk/xs/Apache/RequestUtil/Apache__RequestUtil.h Modified: perl/modperl/trunk/Changes URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/Changes?view=diff&r1=155972&r2=155973 ============================================================================== --- perl/modperl/trunk/Changes (original) +++ perl/modperl/trunk/Changes Wed Mar 2 15:14:28 2005 @@ -12,6 +12,9 @@ =item 1.999_22-dev +if $r->document_root was modified, restore it at the end of request +[joes] + Apache::ServerRec method which set the non-integer fields in the server_rec, now copy the value from the perl scalar, so if it changes or goes out of scope the C struct is not affected. Using internal perl Modified: perl/modperl/trunk/t/response/TestModperl/setupenv.pm URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/t/response/TestModperl/setupenv.pm?view=diff&r1=155972&r2=155973 ============================================================================== --- perl/modperl/trunk/t/response/TestModperl/setupenv.pm (original) +++ perl/modperl/trunk/t/response/TestModperl/setupenv.pm Wed Mar 2 15:14:28 2005 @@ -181,7 +181,7 @@ KeepAlive On - <IfDefine PERL_USEITHREADS> + <IfDefine PERL_ITHREADS> PerlInterpScope connection </Ifdefine> Modified: perl/modperl/trunk/todo/release URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/todo/release?view=diff&r1=155972&r2=155973 ============================================================================== --- perl/modperl/trunk/todo/release (original) +++ perl/modperl/trunk/todo/release Wed Mar 2 15:14:28 2005 @@ -4,7 +4,3 @@ -- see also todo/api_status -- see also todo/release-checklist - -* document_root needs to be restored at the end of request - http://marc.theaimsgroup.com/?t=110842294700006&r=1&w=2 - owner: joes Modified: perl/modperl/trunk/xs/Apache/RequestUtil/Apache__RequestUtil.h URL: http://svn.apache.org/viewcvs/perl/modperl/trunk/xs/Apache/RequestUtil/Apache__RequestUtil.h?view=diff&r1=155972&r2=155973 ============================================================================== --- perl/modperl/trunk/xs/Apache/RequestUtil/Apache__RequestUtil.h (original) +++ perl/modperl/trunk/xs/Apache/RequestUtil/Apache__RequestUtil.h Wed Mar 2 15:14:28 2005 @@ -309,6 +309,21 @@ } } +/* in order to ensure that s->document_root doesn't get corrupted by + * modperl users setting its value, restore the original value at the + * end of each request */ +struct mp_docroot_info { + const char **docroot; + const char *original; +}; + +static apr_status_t restore_docroot(void *data) +{ + struct mp_docroot_info *di = (struct mp_docroot_info *)data; + *di->docroot = di->original; + return APR_SUCCESS; +} + static MP_INLINE const char *mpxs_Apache__RequestRec_document_root(pTHX_ request_rec *r, SV *new_root) @@ -316,10 +331,17 @@ const char *retval = ap_document_root(r); if (new_root) { + struct mp_docroot_info *di; core_server_config *conf; MP_CROAK_IF_THREADS_STARTED("setting $r->document_root"); conf = ap_get_module_config(r->server->module_config, &core_module); + di = apr_palloc(r->pool, sizeof *di); + di->docroot = &conf->ap_document_root; + di->original = conf->ap_document_root; + apr_pool_cleanup_register(r->pool, di, restore_docroot, + restore_docroot); + conf->ap_document_root = apr_pstrdup(r->pool, SvPV_nolen(new_root)); }