Thread: [HACKERS] `array_position...()` causes SIGSEGV
Hello hackers, I met SIGSEGV when using `array_position()` with record type arguments, so I've written a patch which corrects this problem. It seems that `array_position...()` sets wrong memory context for the cached function (in this case `record_eq()`) which is used to find a matching element. The problem is reproducable with the following query. SELECT array_position(ids, (1, 1)) FROM (VALUES (ARRAY[(0, 0)]), (ARRAY[(1, 1)])) AS _(ids); -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Attachment
On Fri, Dec 9, 2016 at 3:14 PM, Junseok Yang <jsyang@bitnine.net> wrote: > I met SIGSEGV when using `array_position()` with record type > arguments, so I've written a patch which corrects this problem. It > seems that `array_position...()` sets wrong memory context for the > cached function (in this case `record_eq()`) which is used to find a > matching element. > > The problem is reproducable with the following query. > > SELECT array_position(ids, (1, 1)) > FROM (VALUES (ARRAY[(0, 0)]), (ARRAY[(1, 1)])) AS _(ids); Good catch. That's present since 13dbc7a8 and the introduction of array_offset(), or array_position() on HEAD, so the patch should be applied down to 9.5. -- Michael
Michael Paquier wrote: > On Fri, Dec 9, 2016 at 3:14 PM, Junseok Yang <jsyang@bitnine.net> wrote: > > I met SIGSEGV when using `array_position()` with record type > > arguments, so I've written a patch which corrects this problem. It > > seems that `array_position...()` sets wrong memory context for the > > cached function (in this case `record_eq()`) which is used to find a > > matching element. > > > > The problem is reproducable with the following query. > > > > SELECT array_position(ids, (1, 1)) > > FROM (VALUES (ARRAY[(0, 0)]), (ARRAY[(1, 1)])) AS _(ids); > > Good catch. That's present since 13dbc7a8 and the introduction of > array_offset(), or array_position() on HEAD, so the patch should be > applied down to 9.5. Thanks for CC'ing me. Looking now. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Junseok Yang wrote: > Hello hackers, > > I met SIGSEGV when using `array_position()` with record type > arguments, so I've written a patch which corrects this problem. It > seems that `array_position...()` sets wrong memory context for the > cached function (in this case `record_eq()`) which is used to find a > matching element. Looks correct to me, so pushed to all affected branches. > The problem is reproducable with the following query. > > SELECT array_position(ids, (1, 1)) > FROM (VALUES (ARRAY[(0, 0)]), (ARRAY[(1, 1)])) AS _(ids); I used this as a new regression test. Thanks for the report and patch! -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services