Re: Bytea PL/Perl transform

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: Bytea PL/Perl transform
Дата
Msg-id CAFj8pRAC-+ce7b4RPOYOcO+NfBO8hH-cZbOjS8cPsPgu49vAgg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Bytea PL/Perl transform  (Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>)
Список pgsql-hackers


út 30. 1. 2024 v 16:43 odesílatel Dagfinn Ilmari Mannsåker <ilmari@ilmari.org> napsal:
Pavel Stehule <pavel.stehule@gmail.com> writes:

> I inserted perl reference support - hstore_plperl and json_plperl does it.
>
> +<->/* Dereference references recursively. */
> +<->while (SvROK(in))
> +<-><-->in = SvRV(in);

That code in hstore_plperl and json_plperl is only relevant because they
deal with non-scalar values (hashes for hstore, and also arrays for
json) which must be passed as references.  The recursive nature of the
dereferencing is questionable, and masked the bug fixed by commit
1731e3741cbbf8e0b4481665d7d523bc55117f63.

bytea_plperl only deals with scalars (specifically strings), so should
not concern itself with references.  In fact, this code breaks returning
objects with overloaded stringification, for example:

CREATE FUNCTION plperlu_overload() RETURNS bytea LANGUAGE plperlu
  TRANSFORM FOR TYPE bytea
  AS $$
    package StringOverload { use overload '""' => sub { "stuff" }; }
    return bless {}, "StringOverload";
  $$;

This makes the server crash with an assertion failure from Perl because
SvPVbyte() was passed a non-scalar value:

postgres: ilmari regression_bytea_plperl [local] SELECT: sv.c:2865: Perl_sv_2pv_flags:
Assertion `SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVFM' failed.

If I remove the dereferincing loop it succeeds:

SELECT encode(plperlu_overload(), 'escape') AS string;
 string
--------
 stuff
(1 row)

Attached is a v2 patch which removes the dereferencing and includes the
above example as a test.

But without dereference it returns bad value.

Maybe there should be a check so references cannot be returned? Probably is not safe pass pointers between Perl and Postgres.

 

- ilmari

В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Tristan Partin"
Дата:
Сообщение: Re: Fix some ubsan/asan related issues
Следующее
От: Akshat Jaimini
Дата:
Сообщение: Re: Parallelize correlated subqueries that execute within each worker