diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-27 23:22:13 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-27 23:22:13 +0000 |
commit | 1045655a257a62ef426235c5f4d4c6881d370a9c (patch) | |
tree | f4aad988eb4558ea89918191a86830242c1f2ab0 | |
parent | 4089d2517560ec2265c42fcf7a786e04207f2787 (diff) | |
download | postgresql-1045655a257a62ef426235c5f4d4c6881d370a9c.tar.gz postgresql-1045655a257a62ef426235c5f4d4c6881d370a9c.zip |
Prevent coredump in current_schemas() if someone has just deleted a
schema that was in our search path.
-rw-r--r-- | src/backend/utils/adt/name.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/backend/utils/adt/name.c b/src/backend/utils/adt/name.c index 746254add59..607f7876a85 100644 --- a/src/backend/utils/adt/name.c +++ b/src/backend/utils/adt/name.c @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.43 2003/03/10 22:28:18 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.44 2003/04/27 23:22:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -246,6 +246,8 @@ current_schema(PG_FUNCTION_ARGS) if (search_path == NIL) PG_RETURN_NULL(); nspname = get_namespace_name(lfirsto(search_path)); + if (!nspname) + PG_RETURN_NULL(); /* recently-deleted namespace? */ PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname))); } @@ -253,25 +255,27 @@ Datum current_schemas(PG_FUNCTION_ARGS) { List *search_path = fetch_search_path(PG_GETARG_BOOL(0)); - int nnames = length(search_path); Datum *names; int i; ArrayType *array; /* +1 here is just to avoid palloc(0) error */ - names = (Datum *) palloc((nnames + 1) * sizeof(Datum)); + names = (Datum *) palloc((length(search_path) + 1) * sizeof(Datum)); i = 0; while (search_path) { char *nspname; nspname = get_namespace_name(lfirsto(search_path)); - names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname)); - i++; + if (nspname) /* watch out for deleted namespace */ + { + names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname)); + i++; + } search_path = lnext(search_path); } - array = construct_array(names, nnames, + array = construct_array(names, i, NAMEOID, NAMEDATALEN, /* sizeof(Name) */ false, /* Name is not by-val */ |