From 4bfc5f1396b18da3a0db73e4406badc4ce793a1e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 25 Apr 2014 15:59:57 -0400 Subject: [PATCH] Fix off-by-one bug in LWLockRegisterTranche(). Original coding failed to enlarge the array as required if the requested tranche_id was equal to LWLockTranchesAllocated. In passing, fix poor style of not casting the result of (re)palloc. --- src/backend/storage/lmgr/lwlock.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 36b4b8bbea..df8f9bfd89 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -350,8 +350,9 @@ CreateLWLocks(void) if (LWLockTrancheArray == NULL) { LWLockTranchesAllocated = 16; - LWLockTrancheArray = MemoryContextAlloc(TopMemoryContext, - LWLockTranchesAllocated * sizeof(LWLockTranche *)); + LWLockTrancheArray = (LWLockTranche **) + MemoryContextAlloc(TopMemoryContext, + LWLockTranchesAllocated * sizeof(LWLockTranche *)); } MainLWLockTranche.name = "main"; @@ -423,11 +424,12 @@ LWLockRegisterTranche(int tranche_id, LWLockTranche *tranche) { int i = LWLockTranchesAllocated; - while (i < tranche_id) + while (i <= tranche_id) i *= 2; - LWLockTrancheArray = repalloc(LWLockTrancheArray, - i * sizeof(LWLockTranche *)); + LWLockTrancheArray = (LWLockTranche **) + repalloc(LWLockTrancheArray, + i * sizeof(LWLockTranche *)); LWLockTranchesAllocated = i; } -- 2.40.0