aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-04-27 23:22:13 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-04-27 23:22:13 +0000
commit1045655a257a62ef426235c5f4d4c6881d370a9c (patch)
treef4aad988eb4558ea89918191a86830242c1f2ab0
parent4089d2517560ec2265c42fcf7a786e04207f2787 (diff)
downloadpostgresql-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.c16
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 */