empty array case in plperl_ref_from_pg_array not handled correctly

Поиск
Список
Период
Сортировка
От Andres Freund
Тема empty array case in plperl_ref_from_pg_array not handled correctly
Дата
Msg-id 20160308063240.usnzg6bsbjrne667@alap3.anarazel.de
обсуждение исходный текст
Ответы Re: empty array case in plperl_ref_from_pg_array not handled correctly  (Alex Hunsaker <badalex@gmail.com>)
Список pgsql-hackers
Hi,

Per the new valgrind animal we get:

http://pgbuildfarm.org/cgi-bin/show_log.pl?nm=skink&dt=2016-03-08%2004%3A22%3A00
2016-03-08 05:56:05.566 UTC [56de6971.723:5] LOG:  statement: select plperl_sum_array('{}');
==1827== Invalid write of size 4
==1827==    at 0x14E35DD1: plperl_ref_from_pg_array (plperl.c:1459)
==1827==    by 0x14E3608C: plperl_call_perl_func (plperl.c:2135)
==1827==    by 0x14E3C24F: plperl_func_handler (plperl.c:2357)
==1827==    by 0x14E3C24F: plperl_call_handler (plperl.c:1778)
==1827==    by 0x5E0531: ExecMakeFunctionResultNoSets (execQual.c:2041)
==1827==    by 0x5E641C: ExecTargetList (execQual.c:5367)
==1827==    by 0x5E641C: ExecProject (execQual.c:5582)
==1827==    by 0x5FC1C1: ExecResult (nodeResult.c:155)
==1827==    by 0x5DF577: ExecProcNode (execProcnode.c:392)
==1827==    by 0x5DB675: ExecutePlan (execMain.c:1566)
==1827==    by 0x5DB675: standard_ExecutorRun (execMain.c:338)
==1827==    by 0x6F4DD7: PortalRunSelect (pquery.c:942)
==1827==    by 0x6F631D: PortalRun (pquery.c:786)
==1827==    by 0x6F2FFA: exec_simple_query (postgres.c:1094)
==1827==    by 0x6F2FFA: PostgresMain (postgres.c:4021)
==1827==    by 0x46D33F: BackendRun (postmaster.c:4258)
==1827==    by 0x46D33F: BackendStartup (postmaster.c:3932)
==1827==    by 0x46D33F: ServerLoop (postmaster.c:1690)
==1827==  Address 0x15803220 is 304 bytes inside a block of size 8,192 alloc'd
==1827==    at 0x4C28BB5: malloc (vg_replace_malloc.c:299)
==1827==    by 0x808A37: AllocSetAlloc (aset.c:864)
==1827==    by 0x80A3B3: palloc (mcxt.c:907)
==1827==    by 0x7E0802: get_func_signature (lsyscache.c:1483)
==1827==    by 0x14E367D6: plperl_call_perl_func (plperl.c:2116)
==1827==    by 0x14E3C24F: plperl_func_handler (plperl.c:2357)
==1827==    by 0x14E3C24F: plperl_call_handler (plperl.c:1778)
==1827==    by 0x5E0531: ExecMakeFunctionResultNoSets (execQual.c:2041)
==1827==    by 0x5E641C: ExecTargetList (execQual.c:5367)
==1827==    by 0x5E641C: ExecProject (execQual.c:5582)
==1827==    by 0x5FC1C1: ExecResult (nodeResult.c:155)
==1827==    by 0x5DF577: ExecProcNode (execProcnode.c:392)
==1827==    by 0x5DB675: ExecutePlan (execMain.c:1566)
==1827==    by 0x5DB675: standard_ExecutorRun (execMain.c:338)
==1827==    by 0x6F4DD7: PortalRunSelect (pquery.c:942)
==1827== 

looking at the code

static SV  *
plperl_ref_from_pg_array(Datum arg, Oid typid)
{
.../* Get total number of elements in each dimension */info->nelems = palloc(sizeof(int) * info->ndims);info->nelems[0]
=nitems;
 

that's not suprising. If ndims is zero nelemes will be a zero-length
array. AddingAssert(info->ndims > 0);
makes it die reliably, without gdb.

ISTM the assumption that an array always has a dimension is a bit more
widespread... E.g. split_array() looks like it'd not work nicely with a
zero dimensional array...

Greetings,

Andres Freund



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

Предыдущее
От: Andres Freund
Дата:
Сообщение: Re: Allowing to run a buildfarm animal under valgrind
Следующее
От: Peter Geoghegan
Дата:
Сообщение: Re: Using quicksort for every external sort run