Adjust recent PERL_SYS_INIT3 call to avoid platforms where it might fail, and to...
authorAndrew Dunstan <[email protected]>
Fri, 5 Jun 2009 20:32:15 +0000 (20:32 +0000)
committerAndrew Dunstan <[email protected]>
Fri, 5 Jun 2009 20:32:15 +0000 (20:32 +0000)
src/pl/plperl/plperl.c

index 20cfb51a8b73b8a0e1c79f9115c9788bec34ac0f..50eee09ef13cc822a8d97f0d0e83c207dd5dcab1 100644 (file)
@@ -1,7 +1,7 @@
 /**********************************************************************
  * plperl.c - perl as a procedural language for PostgreSQL
  *
- *   $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.136.2.1 2009/06/04 16:00:11 adunstan Exp $
+ *   $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.136.2.2 2009/06/05 20:32:15 adunstan Exp $
  *
  **********************************************************************/
 
@@ -388,6 +388,8 @@ plperl_init_interp(void)
 
    int nargs = 3;
 
+   char *dummy_perl_env[1] = { NULL }; 
+
 #ifdef WIN32
 
    /*
@@ -430,11 +432,19 @@ plperl_init_interp(void)
    save_time = loc ? pstrdup(loc) : NULL;
 #endif
 
-
-#ifdef PERL_SYS_INIT3
+   /****
+    * The perl API docs state that PERL_SYS_INIT3 should be called before
+    * allocating interprters. Unfortunately, on some platforms this fails
+    * in the Perl_do_taint() routine, which is called when the platform is
+    * using the system's malloc() instead of perl's own. Other platforms,
+    * notably Windows, fail if PERL_SYS_INIT3 is not called. So we call it
+    * if it's available, unless perl is using the system malloc(), which is
+    * true when MYMALLOC is set.
+    */
+#if defined(PERL_SYS_INIT3) && !defined(MYMALLOC)
    /* only call this the first time through, as per perlembed man page */
    if (interp_state == INTERP_NONE)
-       PERL_SYS_INIT3(&nargs, (char ***) &embedding, NULL);
+       PERL_SYS_INIT3(&nargs, (char ***) &embedding, (char***)&dummy_perl_env);
 #endif
 
    plperl_held_interp = perl_alloc();