Fix core dump when pltcl_elog is called with wrong number of parameters,
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Feb 2003 17:02:11 +0000 (17:02 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Feb 2003 17:02:11 +0000 (17:02 +0000)
per report from Ian Harding.

src/pl/tcl/pltcl.c

index ac8d6046c3157bdb4b7297569d362bbfeb9b0a47..28e08f43d53164a2a3ad47dbe126ae4697184214 100644 (file)
@@ -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;
 }