From 465ed56531aa41536925d2169a7c3c99f9860eb8 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 6 Feb 2003 17:02:11 +0000
Subject: [PATCH] Fix core dump when pltcl_elog is called with wrong number of
 parameters, per report from Ian Harding.

---
 src/pl/tcl/pltcl.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index ac8d6046c31..28e08f43d53 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -31,7 +31,7 @@
  *	  ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.68 2002/12/30 22:10:54 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.69 2003/02/06 17:02:11 tgl Exp $
  *
  **********************************************************************/
 
@@ -1255,7 +1255,7 @@ static int
 pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 		   int argc, CONST84 char *argv[])
 {
-	int			level;
+	volatile int level;
 	sigjmp_buf	save_restart;
 
 	/************************************************************
@@ -1264,18 +1264,6 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 	if (pltcl_restart_in_progress)
 		return TCL_ERROR;
 
-	/************************************************************
-	 * Catch the restart longjmp and begin a controlled
-	 * return though all interpreter levels if it happens
-	 ************************************************************/
-	memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
-	if (sigsetjmp(Warn_restart, 1) != 0)
-	{
-		memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
-		pltcl_restart_in_progress = 1;
-		return TCL_ERROR;
-	}
-
 	if (argc != 3)
 	{
 		Tcl_SetResult(interp, "syntax error - 'elog level msg'",
@@ -1301,17 +1289,29 @@ pltcl_elog(ClientData cdata, Tcl_Interp *interp,
 	{
 		Tcl_AppendResult(interp, "Unknown elog level '", argv[1],
 						 "'", NULL);
+		return TCL_ERROR;
+	}
+
+	/************************************************************
+	 * Catch the longjmp from elog() and begin a controlled
+	 * return though all interpreter levels if it happens
+	 ************************************************************/
+	memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
+	if (sigsetjmp(Warn_restart, 1) != 0)
+	{
 		memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
+		pltcl_restart_in_progress = 1;
 		return TCL_ERROR;
 	}
 
 	/************************************************************
 	 * Call elog(), restore the original restart address
-	 * and return to the caller (if not catched)
+	 * and return to the caller (if no longjmp)
 	 ************************************************************/
 	UTF_BEGIN;
 	elog(level, "%s", UTF_U2E(argv[2]));
 	UTF_END;
+
 	memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
 	return TCL_OK;
 }
-- 
GitLab