1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-21 12:05:57 +03:00

Fix crash if LockErrorCleanup() is called twice

The refactoring in commit 3c0fd64fec removed the clearing of
awaitedLock from LockErrorCleanup(). It's still needed, otherwise
LockErrorCleanup() during abort processing will try to update the
LOCALLOCK struct even after the lock has already been released. Put it
back.

Reported-by: Richard Guo <guofenglinux@gmail.com>
Reported-by: Robins Tharakan <tharakan@gmail.com>
Reported-by: Alexander Lakhin <exclusion@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/CAMbWs4_dNX1SzBmvFdoY-LxJh_4W_BjtVd5i008ihfU-wFF=eg@mail.gmail.com
Discussion: https://www.postgresql.org/message-id/18832-38e5575b1bbd7277@postgresql.org
Discussion: https://www.postgresql.org/message-id/e11a30e5-c0d8-491d-8546-3a1b50c10ad4@gmail.com
This commit is contained in:
Heikki Linnakangas 2025-03-28 20:19:17 +02:00
parent 9ac6f7e7ce
commit 51a0382e8d
3 changed files with 12 additions and 0 deletions

View File

@ -1896,6 +1896,15 @@ GetAwaitedLock(void)
return awaitedLock; return awaitedLock;
} }
/*
* ResetAwaitedLock -- Forget that we are waiting on a lock.
*/
void
ResetAwaitedLock(void)
{
awaitedLock = NULL;
}
/* /*
* MarkLockClear -- mark an acquired lock as "clear" * MarkLockClear -- mark an acquired lock as "clear"
* *

View File

@ -814,6 +814,8 @@ LockErrorCleanup(void)
GrantAwaitedLock(); GrantAwaitedLock();
} }
ResetAwaitedLock();
LWLockRelease(partitionLock); LWLockRelease(partitionLock);
RESUME_INTERRUPTS(); RESUME_INTERRUPTS();

View File

@ -588,6 +588,7 @@ extern bool LockCheckConflicts(LockMethod lockMethodTable,
extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode); extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);
extern void GrantAwaitedLock(void); extern void GrantAwaitedLock(void);
extern LOCALLOCK *GetAwaitedLock(void); extern LOCALLOCK *GetAwaitedLock(void);
extern void ResetAwaitedLock(void);
extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode); extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);
extern LockData *GetLockStatusData(void); extern LockData *GetLockStatusData(void);