aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-01-05 12:01:18 -0500
committerAndrew Dunstan <andrew@dunslane.net>2012-01-05 12:01:18 -0500
commit2abefd9a92f3c02ad4f6030ac1578bbf314db368 (patch)
tree2b8c4f5c15f93f4e1f772597617781c27afb84f8 /src
parent8cf82ac53e9a3d5dd86f16106e3398063a526817 (diff)
downloadpostgresql-2abefd9a92f3c02ad4f6030ac1578bbf314db368.tar.gz
postgresql-2abefd9a92f3c02ad4f6030ac1578bbf314db368.zip
Work around perl bug in SvPVutf8().
Certain things like typeglobs or readonly things like $^V cause perl's SvPVutf8() to die nastily and crash the backend. To avoid that bug we make a copy of the object, which will subsequently be garbage collected. Back patched to 9.1 where we first started using SvPVutf8(). Per -hackers discussion. Original problem reported by David Wheeler.
Diffstat (limited to 'src')
-rw-r--r--src/pl/plperl/plperl_helpers.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/pl/plperl/plperl_helpers.h b/src/pl/plperl/plperl_helpers.h
index ac0a97d7aa6..c671820468a 100644
--- a/src/pl/plperl/plperl_helpers.h
+++ b/src/pl/plperl/plperl_helpers.h
@@ -50,8 +50,14 @@ sv2cstr(SV *sv)
/*
* 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).
*/
- val = SvPVutf8(sv, len);
+ val = SvPVutf8(sv_mortalcopy(sv), len);
/*
* we use perls length in the event we had an embedded null byte to ensure