From 1045655a257a62ef426235c5f4d4c6881d370a9c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 27 Apr 2003 23:22:13 +0000
Subject: [PATCH] Prevent coredump in current_schemas() if someone has just
 deleted a schema that was in our search path.

---
 src/backend/utils/adt/name.c | 16 ++++++++++------
 1 file 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 */
-- 
GitLab