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

Reply via email to