diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-02-20 09:12:02 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-02-20 09:16:00 -0300 |
commit | 545928bbbf9c8c2bfa748702d40a43d6a560216b (patch) | |
tree | 66266c990828b2519749c1b63df82789583fbda4 /src | |
parent | 90f91bfbd76f1ce0e4692f7c17813f5f226050f2 (diff) | |
download | postgresql-545928bbbf9c8c2bfa748702d40a43d6a560216b.tar.gz postgresql-545928bbbf9c8c2bfa748702d40a43d6a560216b.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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/objectaddress.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index f609461f4b0..172568c0029 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -3508,7 +3508,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 */ @@ -4717,10 +4720,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", @@ -4730,17 +4735,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; |