]> granicus.if.org Git - postgresql/commitdiff
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;
 }