aboutsummaryrefslogtreecommitdiff
path: root/src/pl/plperl/plperl_helpers.h
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-01-05 17:59:19 -0500
committerAndrew Dunstan <andrew@dunslane.net>2012-01-05 17:59:19 -0500
commitbd0e74a9ce98c65c94565fb603dcc7b710cd4227 (patch)
tree71458518f9b1dfcced2850a4da8bed4a5170bc10 /src/pl/plperl/plperl_helpers.h
parent7e53515480853604aac825bd3e53e7f9716632b4 (diff)
downloadpostgresql-bd0e74a9ce98c65c94565fb603dcc7b710cd4227.tar.gz
postgresql-bd0e74a9ce98c65c94565fb603dcc7b710cd4227.zip
Fix breakage from earlier plperl fix.
Apparently the perl garbage collector was a bit too eager, so here we control when the new SV is garbage collected.
Diffstat (limited to 'src/pl/plperl/plperl_helpers.h')
-rw-r--r--src/pl/plperl/plperl_helpers.h23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/pl/plperl/plperl_helpers.h b/src/pl/plperl/plperl_helpers.h
index c671820468a..800a408ac4c 100644
--- a/src/pl/plperl/plperl_helpers.h
+++ b/src/pl/plperl/plperl_helpers.h
@@ -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;
}
/*