dougm 02/02/28 19:30:04
Modified: src/modules/perl modperl_perl.c
Log:
trickery to prevent perl_destruct from freeing the environ array does
not work in win32 service shutdown. pull a different stunt to get the
same effect, preventing the server from crashing.
Revision Changes Path
1.11 +18 -0 modperl-2.0/src/modules/perl/modperl_perl.c
Index: modperl_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_perl.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- modperl_perl.c 11 Dec 2001 04:43:36 -0000 1.10
+++ modperl_perl.c 1 Mar 2002 03:30:03 -0000 1.11
@@ -85,6 +85,7 @@
void modperl_perl_destruct(PerlInterpreter *perl)
{
+ char **orig_environ = NULL;
dTHXa(perl);
PERL_SET_CONTEXT(perl);
@@ -97,7 +98,20 @@
* at least, not if modperl is doing things right
* this is a bug in Perl.
*/
+# ifdef WIN32
+ /*
+ * PL_origenviron = environ; doesn't work under win32 service.
+ * we pull a different stunt here that has the same effect of
+ * tricking perl into _not_ freeing the real 'environ' array.
+ * instead temporarily swap with a dummy array we malloc
+ * here which is ok to let perl free.
+ */
+ orig_environ = environ;
+ environ = safemalloc(2 * sizeof(char *));
+ environ[0] = NULL;
+# else
PL_origenviron = environ;
+# endif
#endif
if (PL_endav) {
@@ -113,4 +127,8 @@
#ifndef WIN32
perl_free(perl);
#endif
+
+ if (orig_environ) {
+ environ = orig_environ;
+ }
}