mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +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:
parent
2b1971c031
commit
ddad002dea
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user