]> granicus.if.org Git - postgresql/commitdiff
Fix breakage from earlier plperl fix.
authorAndrew Dunstan <andrew@dunslane.net>
Thu, 5 Jan 2012 22:59:19 +0000 (17:59 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Thu, 5 Jan 2012 22:59:19 +0000 (17:59 -0500)
Apparently the perl garbage collector was a bit too eager, so here
we control when the new SV is garbage collected.

src/pl/plperl/plperl_helpers.h

index c671820468ae8382229cba422b371aa4c30902bb..800a408ac4cd7f0a76978c22c516f6fda5711838 100644 (file)
@@ -45,25 +45,32 @@ utf_e2u(const char *str)
 static inline char *
 sv2cstr(SV *sv)
 {
-       char       *val;
+       char       *val, *res;
        STRLEN          len;
+       SV         *nsv;
 
        /*
         * get a utf8 encoded char * out of perl. *note* it may not be valid utf8!
         *
         * SvPVutf8() croaks nastily on certain things, like typeglobs and
-        * readonly object such as $^V. That's a perl bug - it's not supposed to
-        * happen. To avoid crashing the backend, we make a mortal copy of the
-        * sv before passing it to SvPVutf8(). The copy will be garbage collected
-        * very soon (see perldoc perlguts).
+        * readonly objects such as $^V. That's a perl bug - it's not supposed to
+        * happen. To avoid crashing the backend, we make a copy of the
+        * sv before passing it to SvPVutf8(). The copy is garbage collected 
+        * when we're done with it.
         */
-       val = SvPVutf8(sv_mortalcopy(sv), len);
+       nsv = newSVsv(sv);
+       val = SvPVutf8(nsv, len);
 
        /*
-        * we use perls length in the event we had an embedded null byte to ensure
+        * we use perl's length in the event we had an embedded null byte to ensure
         * we error out properly
         */
-       return utf_u2e(val, len);
+       res =  utf_u2e(val, len);
+
+       /* safe now to garbage collect the new SV */
+       SvREFCNT_dec(nsv);
+
+       return res;
 }
 
 /*