diff --git a/src/modules/Perl/perlmod.c b/src/modules/Perl/perlmod.c index df3383616660ccacd79f0be0e61665ae444861b8..fd3975c600408a1a53ff115101f3c690405f76f9 100644 --- a/src/modules/Perl/perlmod.c +++ b/src/modules/Perl/perlmod.c @@ -186,9 +186,33 @@ static void perlmod_create(INT32 args) MEMCPY(env_blockp,k->val.u.string->str,k->ind.u.string->len); env_blockp+=k->val.u.string->len; - *(env_blockp++)='0'; + *(env_blockp++)=0; } THIS->env[d]=0; + } else { + /* Perl likes to be able to write in the environment block, + * give it it's own copy to protect ourselves.. /Hubbe + */ + INT32 d; + int env_block_size=0; + char *env_blockp; + + for(d=0;environ[d];d++) + env_block_size+=strlen(environ[d])+1; + + THIS->env_block=xalloc(env_block_size); + THIS->env=(char **)xalloc(d+1); + + env_blockp=THIS->env_block; + + for(d=0;environ[d];d++) + { + int l=strlen(environ[d]); + THIS->env[d++]=env_blockp; + MEMCPY(env_blockp,environ[d],l+1); + env_blockp+=l+1; + } + THIS->env[d]=0; } THREADS_ALLOW();