diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-16 04:28:01 -0400 | 
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-09-16 04:28:01 -0400 | 
| commit | b04214f6cf3a39f45579aba5b7e687fa4f44c84b (patch) | |
| tree | 39a3c6517b5bca041facfc5fb37ddb4aca9cb1b6 /src/backend/access/gist | |
| parent | cac73320ef0f35304e2dcade0fe1d32c07cb765f (diff) | |
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.
Diffstat (limited to 'src/backend/access/gist')
| -rw-r--r-- | src/backend/access/gist/gistscan.c | 5 | 
1 files changed, 4 insertions, 1 deletions
| diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index a53d8cd0873..0fa8814e3a5 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -138,12 +138,15 @@ gistendscan(PG_FUNCTION_ARGS)  	{  		gistfreestack(so->stack);  		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);  		MemoryContextDelete(so->tempCxt); -		pfree(scan->opaque); +		pfree(so);  	}  	PG_RETURN_VOID(); | 
