SIGSEGV in GrantLockLocal()

Richard Guo <guofenglinux@gmail.com>

From: Richard Guo <guofenglinux@gmail.com>
To: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2024-12-18T06:17:34Z
Lists: pgsql-hackers
Recently, I've encountered a core dump several times on master, with a
backtrace like the one below.  This one happened on 0f23dedc9.  I was
running some fuzz testing and had started around 20 sessions
concurrently.

(gdb) bt
#0  in GrantLockLocal at lock.c:1758
#1  in GrantAwaitedLock at lock.c:1840
#2  in LockErrorCleanup at proc.c:809
#3  in AbortTransaction at xact.c:2846
#4  in AbortCurrentTransactionInternal at xact.c:3520
#5  in AbortCurrentTransaction at xact.c:3449
#6  in PostgresMain at postgres.c:4535
#7  in BackendMain at backend_startup.c:107
#8  in postmaster_child_launch at launch_backend.c:274
#9  in BackendStartup at postmaster.c:3391
#10 in ServerLoop at postmaster.c:1678
#11 in PostmasterMain at postmaster.c:1376
#12 in main at main.c:224

It seems that the lock request is not granted as expected, since
locallock->lockOwners is a NULL pointer.

(gdb) p locallock->lockOwners
$4 = (LOCALLOCKOWNER *) 0x0
(gdb) p locallock->numLockOwners
$5 = 0
(gdb) p locallock->maxLockOwners
$6 = 8

Unfortunately, I don't have a reliable way to trigger this issue.  I'm
wondering if anyone has any insights into what might be happening.

Thanks
Richard



Commits

  1. Fix crash if LockErrorCleanup() is called twice

  2. Split ProcSleep function into JoinWaitQueue and ProcSleep