diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 10d300a3e8..e4697f68ae 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3646,6 +3646,7 @@ RelationGetIndexList(Relation relation) ScanKeyData skey; HeapTuple htup; List *result; + List *oldlist; char replident = relation->rd_rel->relreplident; Oid oidIndex = InvalidOid; Oid pkeyIndex = InvalidOid; @@ -3737,6 +3738,7 @@ RelationGetIndexList(Relation relation) /* Now save a copy of the completed list in the relcache entry. */ oldcxt = MemoryContextSwitchTo(CacheMemoryContext); + oldlist = relation->rd_indexlist; relation->rd_indexlist = list_copy(result); relation->rd_oidindex = oidIndex; if (replident == REPLICA_IDENTITY_DEFAULT && OidIsValid(pkeyIndex)) @@ -3748,6 +3750,9 @@ RelationGetIndexList(Relation relation) relation->rd_indexvalid = 1; MemoryContextSwitchTo(oldcxt); + /* Don't leak the old list, if there is one */ + list_free(oldlist); + return result; } @@ -4141,6 +4146,14 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind) list_free(indexoidlist); + /* Don't leak the old values of these bitmaps, if any */ + bms_free(relation->rd_indexattr); + relation->rd_indexattr = NULL; + bms_free(relation->rd_keyattr); + relation->rd_keyattr = NULL; + bms_free(relation->rd_idattr); + relation->rd_idattr = NULL; + /* * Now save copies of the bitmaps in the relcache entry. We intentionally * set rd_indexattr last, because that's the one that signals validity of