From a062473696aa6e0944951b719c8e8a45eb8f526e Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 23 Mar 2001 00:36:38 +0000
Subject: [PATCH] Fix problems with coredumps due to ^C when longjmp buffer
 isn't valid. Now, we will only catch ^C at times when it is valid.

---
 src/bin/psql/mainloop.c | 17 +++++++++++++++--
 src/bin/psql/startup.c  |  6 +-----
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
index 919a9f5513f..ef124d2fa0f 100644
--- a/src/bin/psql/mainloop.c
+++ b/src/bin/psql/mainloop.c
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.37 2001/03/22 04:00:21 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.38 2001/03/23 00:36:38 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "mainloop.h"
@@ -137,6 +137,10 @@ MainLoop(FILE *source)
 				break;
 			}
 		}
+
+		/* establish the control-C handler only after main_loop_jmp is ready */
+		pqsignal(SIGINT, handle_sigint);	/* control-C => cancel */
+
 #endif	 /* not WIN32 */
 
 		if (slashCmdStatus == CMD_NEWEDIT)
@@ -546,7 +550,8 @@ MainLoop(FILE *source)
 	/*
 	 * Process query at the end of file without a semicolon
 	 */
-	if (query_buf->len > 0 && !pset.cur_cmd_interactive)
+	if (query_buf->len > 0 && !pset.cur_cmd_interactive &&
+		successResult == EXIT_SUCCESS)
 	{
 		success = SendQuery(query_buf->data);
 
@@ -556,6 +561,14 @@ MainLoop(FILE *source)
 			successResult = EXIT_BADCONN;
 	}
 
+	/*
+	 * Reset SIGINT handler because main_loop_jmp will be invalid as soon
+	 * as we exit this routine.  If there is an outer MainLoop instance,
+	 * it will re-enable ^C catching as soon as it gets back to the top
+	 * of its loop and resets main_loop_jmp to point to itself.
+	 */
+	pqsignal(SIGINT, SIG_DFL);
+
 	destroyPQExpBuffer(query_buf);
 	destroyPQExpBuffer(previous_buf);
 
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 55ad9692c66..5729b3e27e5 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.45 2001/03/22 04:00:23 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.46 2001/03/23 00:36:38 tgl Exp $
  */
 #include "postgres_fe.h"
 
@@ -223,10 +223,6 @@ main(int argc, char *argv[])
 	SetVariable(pset.vars, "PORT", PQport(pset.db));
 	SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
 
-#ifndef WIN32
-	pqsignal(SIGINT, handle_sigint);	/* control-C => cancel */
-#endif
-
 	/*
 	 * Now find something to do
 	 */
-- 
GitLab