]> granicus.if.org Git - postgresql/commitdiff
Avoid double free of _SPI_current->tuptable. AtEOSubXact_SPI() now tries to
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Dec 2006 00:40:27 +0000 (00:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Dec 2006 00:40:27 +0000 (00:40 +0000)
release it in a subtransaction abort, but this neglects possibility that
someone outside SPI already did.  Fix is for spi.c to forget about a tuptable
as soon as it's handed it back to the caller.
Per bug #2817 from Michael Andreen.

src/backend/executor/spi.c

index d4fa794bc3d9da607c0131edddc25ade97219ba6..90336e4be25bcc07cc73701a2e6e5cc3d4958c04 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.165 2006/11/21 22:35:29 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.166 2006/12/08 00:40:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1543,6 +1543,9 @@ fail:
        SPI_lastoid = my_lastoid;
        SPI_tuptable = my_tuptable;
 
+       /* tuptable now is caller's responsibility, not SPI's */
+       _SPI_current->tuptable = NULL;
+
        return my_res;
 }
 
@@ -1695,6 +1698,9 @@ _SPI_cursor_operation(Portal portal, bool forward, long count,
        SPI_processed = _SPI_current->processed;
        SPI_tuptable = _SPI_current->tuptable;
 
+       /* tuptable now is caller's responsibility, not SPI's */
+       _SPI_current->tuptable = NULL;
+
        /* Pop the SPI stack */
        _SPI_end_call(true);
 }