diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2015-03-30 13:05:27 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2015-03-30 13:05:35 -0400 |
commit | 2897e069c1f4309a237a1fa4bf5d2fcd9c4b9868 (patch) | |
tree | fb62eadf0eef89ae972de7a90555730393aa9020 | |
parent | f444de5e34f673043b948e14ad3f76a30f698ecb (diff) |
Fix rare core dump in BackendIdGetTransactionIds().
BackendIdGetTransactionIds() neglected the possibility that the PROC
pointer in a ProcState array entry is null. In current usage, this could
only crash if the other backend had exited since pgstat_read_current_status
saw it as active, which is a pretty narrow window. But it's reachable in
the field, per bug #12918 from Vladimir Borodin.
Back-patch to 9.4 where the faulty code was introduced.
-rw-r--r-- | src/backend/storage/ipc/sinvaladt.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 0328660b83e..bd3e2c7383b 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -410,9 +410,7 @@ BackendIdGetProc(int backendID) void BackendIdGetTransactionIds(int backendID, TransactionId *xid, TransactionId *xmin) { - ProcState *stateP; SISeg *segP = shmInvalBuffer; - PGXACT *xact; *xid = InvalidTransactionId; *xmin = InvalidTransactionId; @@ -422,11 +420,16 @@ BackendIdGetTransactionIds(int backendID, TransactionId *xid, TransactionId *xmi if (backendID > 0 && backendID <= segP->lastBackend) { - stateP = &segP->procState[backendID - 1]; - xact = &ProcGlobal->allPgXact[stateP->proc->pgprocno]; + ProcState *stateP = &segP->procState[backendID - 1]; + PGPROC *proc = stateP->proc; - *xid = xact->xid; - *xmin = xact->xmin; + if (proc != NULL) + { + PGXACT *xact = &ProcGlobal->allPgXact[proc->pgprocno]; + + *xid = xact->xid; + *xmin = xact->xmin; + } } LWLockRelease(SInvalWriteLock); |