From 728ac262d18e17342c28183846c1405768f93d13 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 20 Feb 2019 09:12:02 -0300 Subject: [PATCH] Make object address handling more robust MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/backend/catalog/objectaddress.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 7db942dcba..fba40ad77d 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);