From 359dea2859c63e73c8f3f4d769e5cf1eda2a428d Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Fri, 16 Mar 2012 19:55:41 +0200
Subject: [PATCH] pg_dump: Fix crash with invalid pg_cast row

An invalid combination of pg_cast.castfunc and pg_cast.castmethod
would result in a segmentation fault.  Now it prints a warning.

found by Coverity
---
 src/bin/pg_dump/pg_dump.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 86d8a090624..2b0a5ff81ad 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -9477,18 +9477,21 @@ dumpCast(Archive *fout, CastInfo *cast)
 			appendPQExpBuffer(defqry, "WITH INOUT");
 			break;
 		case COERCION_METHOD_FUNCTION:
-		{
-			char   *fsig = format_function_signature(fout, funcInfo, true);
+			if (funcInfo)
+			{
+				char   *fsig = format_function_signature(fout, funcInfo, true);
 
-			/*
-			 * Always qualify the function name, in case it is not in
-			 * pg_catalog schema (format_function_signature won't qualify it).
-			 */
-			appendPQExpBuffer(defqry, "WITH FUNCTION %s.%s",
-							  fmtId(funcInfo->dobj.namespace->dobj.name), fsig);
-			free(fsig);
+				/*
+				 * Always qualify the function name, in case it is not in
+				 * pg_catalog schema (format_function_signature won't qualify it).
+				 */
+				appendPQExpBuffer(defqry, "WITH FUNCTION %s.%s",
+								  fmtId(funcInfo->dobj.namespace->dobj.name), fsig);
+				free(fsig);
+			}
+			else
+				write_msg(NULL, "WARNING: bogus value in pg_cast.castfunc or pg_cast.castmethod field\n");
 			break;
-		}
 		default:
 			write_msg(NULL, "WARNING: bogus value in pg_cast.castmethod field\n");
 	}
-- 
GitLab