1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-27 22:56:53 +03:00

Make object address handling more robust

pg_identify_object_as_address crashes when passed certain tuples from
inconsistent system catalogs.  Make it more defensive.

Author: Álvaro Herrera
Reviewed-by: Michaël Paquier
Discussion: https://postgr.es/m/20190218202743.GA12392@alvherre.pgsql
This commit is contained in:
Alvaro Herrera 2019-02-20 09:12:02 -03:00
parent 2b1971c031
commit ddad002dea

View File

@ -3815,7 +3815,10 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
pfree(identity);
/* object_names */
values[1] = PointerGetDatum(strlist_to_textarray(names));
if (names != NIL)
values[1] = PointerGetDatum(strlist_to_textarray(names));
else
values[1] = PointerGetDatum(construct_empty_array(TEXTOID));
nulls[1] = false;
/* object_args */
@ -5134,10 +5137,12 @@ strlist_to_textarray(List *list)
{
ArrayType *arr;
Datum *datums;
bool *nulls;
int j = 0;
ListCell *cell;
MemoryContext memcxt;
MemoryContext oldcxt;
int lb[1];
memcxt = AllocSetContextCreate(CurrentMemoryContext,
"strlist to array",
@ -5145,17 +5150,25 @@ strlist_to_textarray(List *list)
oldcxt = MemoryContextSwitchTo(memcxt);
datums = palloc(sizeof(text *) * list_length(list));
nulls = palloc(sizeof(bool) * list_length(list));
foreach(cell, list)
{
char *name = lfirst(cell);
datums[j++] = CStringGetTextDatum(name);
if (name)
{
nulls[j] = false;
datums[j++] = CStringGetTextDatum(name);
}
else
nulls[j++] = true;
}
MemoryContextSwitchTo(oldcxt);
arr = construct_array(datums, list_length(list),
TEXTOID, -1, false, 'i');
lb[0] = 1;
arr = construct_md_array(datums, nulls, 1, &j,
lb, TEXTOID, -1, false, 'i');
MemoryContextDelete(memcxt);
return arr;