gistendscan() forgot to free so->giststate.

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.
This commit is contained in:
Tom Lane 2011-09-16 04:28:15 -04:00
parent 33e111f225
commit ca00f19157
1 changed files with 4 additions and 1 deletions

View 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();