On 01/04/2012 08:32 PM, Tom Lane wrote:
Andrew Dunstan<and...@dunslane.net> writes:
Tom said:
2. A slightly cleaner fix for this should be to duplicate the SV and
then release the copy around the SvPVutf8 call, only if it's readonly.
"Fixing" it in do_util_elog is entirely the wrong thing.
How do we tell if it's readonly?
SvREADONLY(sv) macro.
OK, so this seems to fix The issue David found:
diff --git a/src/pl/plperl/plperl_helpers.h b/src/pl/plperl/plperl_helpers.h
index ac0a97d..f0e1afa 100644
--- a/src/pl/plperl/plperl_helpers.h
+++ b/src/pl/plperl/plperl_helpers.h
@@ -51,7 +51,10 @@ sv2cstr(SV *sv)
/*
* get a utf8 encoded char * out of perl. *note* it may not be
valid utf8!
*/
- val = SvPVutf8(sv, len);
+ if (SvREADONLY(sv))
+ val = SvPVutf8(sv_mortalcopy(sv), len);
+ else
+ val = SvPVutf8(sv, len);
/*
* we use perls length in the event we had an embedded null byte to
ensure
but it doesn't fix the one I found which passes a typeglob to elog():
do '$foo=1; elog(NOTICE,*foo);' language plperl;
That still crashes, but doesn't if we use sv_mortalcopy unconditionally.
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers