diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2015-03-12 15:29:58 +0100 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2015-03-12 15:34:32 +0100 |
commit | 26d2c5dc8dc24febee8c3dd472407d7bbdcc245d (patch) | |
tree | 048fad670bd2095e3d9c4a32935a2d0d6edb04c1 /src | |
parent | f4abd0241de20d5d6a79b84992b9e88603d44134 (diff) | |
download | postgresql-26d2c5dc8dc24febee8c3dd472407d7bbdcc245d.tar.gz postgresql-26d2c5dc8dc24febee8c3dd472407d7bbdcc245d.zip |
Fix memory leaks in GIN index vacuum.
Per bug #12850 by Walter Nordmann. Backpatch to 9.4 where the leak was
introduced.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/gin/ginvacuum.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index 9e76df36129..eba572b0d8a 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -432,27 +432,32 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3 else if (GinGetNPosting(itup) > 0) { int nitems; - ItemPointer uncompressed; + ItemPointer items_orig; + bool free_items_orig; + ItemPointer items; - /* - * Vacuum posting list with proper function for compressed and - * uncompressed format. - */ + /* Get list of item pointers from the tuple. */ if (GinItupIsCompressed(itup)) - uncompressed = ginPostingListDecode((GinPostingList *) GinGetPosting(itup), &nitems); + { + items_orig = ginPostingListDecode((GinPostingList *) GinGetPosting(itup), &nitems); + free_items_orig = true; + } else { - uncompressed = (ItemPointer) GinGetPosting(itup); + items_orig = (ItemPointer) GinGetPosting(itup); nitems = GinGetNPosting(itup); + free_items_orig = false; } - uncompressed = ginVacuumItemPointers(gvs, uncompressed, nitems, - &nitems); - if (uncompressed) + /* Remove any items from the list that need to be vacuumed. */ + items = ginVacuumItemPointers(gvs, items_orig, nitems, &nitems); + + if (free_items_orig) + pfree(items_orig); + + /* If any item pointers were removed, recreate the tuple. */ + if (items) { - /* - * Some ItemPointers were deleted, recreate tuple. - */ OffsetNumber attnum; Datum key; GinNullCategory category; @@ -461,7 +466,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3 if (nitems > 0) { - plist = ginCompressPostingList(uncompressed, nitems, GinMaxItemSize, NULL); + plist = ginCompressPostingList(items, nitems, GinMaxItemSize, NULL); plistsize = SizeOfGinPostingList(plist); } else @@ -500,6 +505,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3 RelationGetRelationName(gvs->index)); pfree(itup); + pfree(items); } } } |