The changes #8803 and #8896 that fixed JPL for use with
Jarkko Hietaniemi [Fri, 13 Jun 2003 05:09:17 +0000 (05:09 +0000)]
JDK 1.2/1.3 had somehow disappeared.
p4raw-link: @8803 on //depot/perl: 103a71894980ab015937511f33d840c7f030e8a4

p4raw-id: //depot/perl@19756

perl.c
perl.h

diff --git a/perl.c b/perl.c
index 9914935..622d2de 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -3518,6 +3518,8 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
     char *s;
     SV *sv;
     GV* tmpgv;
+    char **dup_env_base = 0;
+    int dup_env_count = 0;
 
     PL_toptarget = NEWSV(0,0);
     sv_upgrade(PL_toptarget, SVt_PVFM);
@@ -3572,6 +3574,26 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
        {
            environ[0] = Nullch;
        }
+#ifdef NEED_ENVIRON_DUP_FOR_MODIFY
+       {
+           char **env_base;
+           for (env_base = env; *env; env++) 
+               dup_env_count++;
+           if ((dup_env_base = (char **)
+                safesysmalloc( sizeof(char *) * (dup_env_count+1) ))) {
+               char **dup_env;
+               for (env = env_base, dup_env = dup_env_base;
+                    *env;
+                    env++, dup_env++) {
+                   /* With environ one needs to use safesysmalloc(). */
+                   *dup_env = safesysmalloc(strlen(*env) + 1);
+                   (void)strcpy(*dup_env, *env);
+               }
+               *dup_env = Nullch;
+               env = dup_env_base;
+           } /* else what? */
+       }
+#endif /* NEED_ENVIRON_DUP_FOR_MODIFY */
        if (env)
          for (; *env; env++) {
            if (!(s = strchr(*env,'=')))
@@ -3586,6 +3608,14 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
            if (env != environ)
                mg_set(sv);
          }
+#ifdef NEED_ENVIRON_DUP_FOR_MODIFY
+       if (dup_env_base) {
+           char **dup_env;
+           for (dup_env = dup_env_base; *dup_env; dup_env++)
+               safesysfree(*dup_env);
+           safesysfree(dup_env_base);
+       }
+#endif /* NEED_ENVIRON_DUP_FOR_MODIFY */
 #endif /* USE_ENVIRON_ARRAY */
     }
     TAINT_NOT;
diff --git a/perl.h b/perl.h
index a7360f8..f433168 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1924,6 +1924,13 @@ typedef struct clone_params CLONE_PARAMS;
 #  endif
 #endif
 
+#ifdef JPL
+    /* E.g. JPL needs to operate on a copy of the real environment.
+     * JDK 1.2 and 1.3 seem to get upset if the original environment
+     * is diddled with. */
+#   define NEED_ENVIRON_DUP_FOR_MODIFY
+#endif
+
 #ifndef PERL_SYS_INIT3
 #  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
 #endif