]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
gistendscan() forgot to free so->giststate.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 Sep 2011 08:28:15 +0000 (04:28 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 Sep 2011 08:28:15 +0000 (04:28 -0400)
This oversight led to a massive memory leak --- upwards of 10KB per tuple
--- during creation-time verification of an exclusion constraint based on a
GIST index.  In most other scenarios it'd just be a leak of 10KB that would
be recovered at end of query, so not too significant; though perhaps the
leak would be noticeable in a situation where a GIST index was being used
in a nestloop inner indexscan.  In any case, it's a real leak of long
standing, so patch all supported branches.  Per report from Harald Fuchs.

src/backend/access/gist/gistscan.c

index aeb1a8282c8702737ac93a8faa7b6b7458d28188..27b92e4a3627e6c666249f85021a826a4547377e 100644 (file)
@@ -226,14 +226,17 @@ gistendscan(PG_FUNCTION_ARGS)
                gistfreestack(so->stack);
                gistfreestack(so->markstk);
                if (so->giststate != NULL)
+               {
                        freeGISTstate(so->giststate);
+                       pfree(so->giststate);
+               }
                /* drop pins on buffers -- we aren't holding any locks */
                if (BufferIsValid(so->curbuf))
                        ReleaseBuffer(so->curbuf);
                if (BufferIsValid(so->markbuf))
                        ReleaseBuffer(so->markbuf);
                MemoryContextDelete(so->tempCxt);
-               pfree(scan->opaque);
+               pfree(so);
        }
 
        PG_RETURN_VOID();