summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2015-03-30 13:05:27 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2015-03-30 13:05:35 -0400
commit2897e069c1f4309a237a1fa4bf5d2fcd9c4b9868 (patch)
treefb62eadf0eef89ae972de7a90555730393aa9020
parentf444de5e34f673043b948e14ad3f76a30f698ecb (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.c15
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);