1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-11 00:12:06 +03:00

Fix core dump when pltcl_elog is called with wrong number of parameters,

per report from Ian Harding.
This commit is contained in:
Tom Lane
2003-02-06 17:02:22 +00:00
parent de42a5f53d
commit 2425ab3ece

View File

@@ -31,7 +31,7 @@
* ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.66.2.1 2002/11/22 16:25:55 tgl Exp $
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.66.2.2 2003/02/06 17:02:22 tgl Exp $
*
**********************************************************************/
@@ -1248,7 +1248,7 @@ static int
pltcl_elog(ClientData cdata, Tcl_Interp *interp,
int argc, char *argv[])
{
int level;
volatile int level;
sigjmp_buf save_restart;
/************************************************************
@@ -1257,18 +1257,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'",
@@ -1294,17 +1282,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;
}