From: Tom Lane Date: Fri, 25 Apr 2014 19:59:57 +0000 (-0400) Subject: Fix off-by-one bug in LWLockRegisterTranche(). X-Git-Tag: REL9_4_BETA1~106 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4bfc5f1396b18da3a0db73e4406badc4ce793a1e;p=postgresql 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. --- 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; }