]> granicus.if.org Git - postgresql/commitdiff
Reset CurrentMemoryContext to TopMemoryContext at the beginning of error
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 Apr 2000 21:29:23 +0000 (21:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 Apr 2000 21:29:23 +0000 (21:29 +0000)
cleanup, ie, as soon as we have caught the longjmp.  This ensures that
current context will be a valid context throughout error cleanup.  Before
it was possible that current context was pointing at a context that would
get deleted during cleanup, leaving any subsequent pallocs in deep
trouble.  I was able to provoke an Assert failure when compiled with
asserts + -DCLOBBER_FREED_MEMORY, if I did something that would cause
an error to be reported by the backend large-object code, because indeed
that code operates in a context that gets deleted partway through xact
abort --- and CurrentMemoryContext was still pointing at it!  Boo hiss.

src/backend/tcop/postgres.c

index bcb63bb2193e13cf84d8637478a0c12009cb9149..b6c6935613058913d9f52d31b3fd459dcb95266a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.153 2000/04/28 05:07:34 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.154 2000/04/30 21:29:23 tgl Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -127,7 +127,6 @@ bool                ExitAfterAbort = false;
 extern int     NBuffers;
 
 static bool EchoQuery = false; /* default don't echo */
-time_t         tim;
 char           pg_pathname[MAXPGPATH];
 FILE      *StatFp = NULL;
 
@@ -1453,7 +1452,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.153 $ $Date: 2000/04/28 05:07:34 $\n");
+               puts("$Revision: 1.154 $ $Date: 2000/04/30 21:29:23 $\n");
        }
 
        /*
@@ -1473,7 +1472,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 
        if (sigsetjmp(Warn_restart, 1) != 0)
        {
-               time(&tim);
+               /* Make sure we are in a valid memory context */
+               MemoryContextSwitchTo(TopMemoryContext);
 
                if (Verbose)
                        TPRINTF(TRACE_VERBOSE, "AbortCurrentTransaction");