Author: gozer
Date: Fri Dec 16 13:20:23 2005
New Revision: 357236

URL: http://svn.apache.org/viewcvs?rev=357236&view=rev
Log:
"local %ENV;" caused Segmentation fault in modperl_env_request_tie()

Reported-By:  Peter Walsham <[EMAIL PROTECTED]>
Thread: http://thread.gmane.org/gmane.comp.apache.mod-perl/22236


Modified:
    perl/modperl/trunk/src/modules/perl/modperl_env.c

Modified: perl/modperl/trunk/src/modules/perl/modperl_env.c
URL: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_env.c?rev=357236&r1=357235&r2=357236&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_env.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_env.c Fri Dec 16 13:20:23 2005
@@ -15,8 +15,13 @@
 
 #include "mod_perl.h"
 
-#define EnvMgObj SvMAGIC((SV*)ENVHV)->mg_ptr
-#define EnvMgLen SvMAGIC((SV*)ENVHV)->mg_len
+#define EnvMgOK  ((SV*)ENVHV && SvMAGIC((SV*)ENVHV))
+#define EnvMgObj (EnvMgOK ? SvMAGIC((SV*)ENVHV)->mg_ptr : NULL)
+#define EnvMgLen (EnvMgOK ? SvMAGIC((SV*)ENVHV)->mg_len : 0)
+#define EnvMgObjSet(val){ \
+    if (EnvMgOK) SvMAGIC((SV*)ENVHV)->mg_ptr = (char *)val;}
+#define EnvMgLenSet(val) {\
+    if (EnvMgOK) SvMAGIC((SV*)ENVHV)->mg_len = val;}
 
 /* XXX: move to utils? */
 static unsigned long modperl_interp_address(pTHX)
@@ -401,8 +406,8 @@
 
 void modperl_env_request_tie(pTHX_ request_rec *r)
 {
-    EnvMgObj = (char *)r;
-    EnvMgLen = -1;
+    EnvMgObjSet(r);
+    EnvMgLenSet(-1);
 
 #ifdef MP_PERL_HV_GMAGICAL_AWARE
     MP_TRACE_e(MP_FUNC, "[%s/0x%lx] tie %%ENV, $r\n\t (%s%s)",
@@ -414,7 +419,7 @@
 
 void modperl_env_request_untie(pTHX_ request_rec *r)
 {
-    EnvMgObj = NULL;
+    EnvMgObjSet(NULL);
 
 #ifdef MP_PERL_HV_GMAGICAL_AWARE
     MP_TRACE_e(MP_FUNC, "[%s/0x%lx] untie %%ENV; # from r\n\t (%s%s)",


Reply via email to