empty array case in plperl_ref_from_pg_array not handled correctly

From: Andres Freund <andres(at)anarazel(dot)de>
To: Alexey Klyukin <alexk(at)hintbits(dot)com>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: empty array case in plperl_ref_from_pg_array not handled correctly
Date: 2016-03-08 06:32:40
Message-ID: 20160308063240.usnzg6bsbjrne667@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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. Adding
Assert(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

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Geoghegan 2016-03-08 06:57:38 Re: Using quicksort for every external sort run
Previous Message Tsunakawa, Takayuki 2016-03-08 06:24:53 Re: [HACKERS] How can we expand PostgreSQL ecosystem?