mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
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.
This commit is contained in:
parent
0633a60f4d
commit
701dcc983e
@ -403,9 +403,7 @@ BackendIdGetProc(int backendID)
|
||||
void
|
||||
BackendIdGetTransactionIds(int backendID, TransactionId *xid, TransactionId *xmin)
|
||||
{
|
||||
ProcState *stateP;
|
||||
SISeg *segP = shmInvalBuffer;
|
||||
PGXACT *xact;
|
||||
|
||||
*xid = InvalidTransactionId;
|
||||
*xmin = InvalidTransactionId;
|
||||
@ -415,11 +413,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);
|
||||
|
Loading…
Reference in New Issue
Block a user