aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2019-02-20 09:12:02 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2019-02-20 11:22:48 -0300
commit728ac262d18e17342c28183846c1405768f93d13 (patch)
tree5f629027a2ca1d92abd179ba07416022c3f97574
parentfbec6fa38ade6fd0c4c5c5984f723ba351a44e85 (diff)
downloadpostgresql-728ac262d18e17342c28183846c1405768f93d13.tar.gz
postgresql-728ac262d18e17342c28183846c1405768f93d13.zip
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
-rw-r--r--src/backend/catalog/objectaddress.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 7db942dcbac..fba40ad77df 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -3887,7 +3887,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 */
@@ -5209,10 +5212,12 @@ strlist_to_textarray(List *list)
{
ArrayType *arr;
Datum *datums;
+ bool *nulls;
int j = 0;
ListCell *cell;
MemoryContext memcxt;
MemoryContext oldcxt;
+ int lb[1];
/* Work in a temp context; easier than individually pfree'ing the Datums */
memcxt = AllocSetContextCreate(CurrentMemoryContext,
@@ -5221,18 +5226,26 @@ strlist_to_textarray(List *list)
oldcxt = MemoryContextSwitchTo(memcxt);
datums = (Datum *) palloc(sizeof(Datum) * 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);