Fix NULL pointer access in logical replication workers

From: Petr Jelinek <pjmodos@pjmodos.net>
This commit is contained in:
Peter Eisentraut 2017-01-23 12:33:27 -05:00
parent 6cffe54aef
commit 70c56a014e
2 changed files with 30 additions and 19 deletions

View File

@ -349,10 +349,21 @@ logicalrep_worker_stop(Oid subid)
ResetLatch(&MyProc->procLatch);
/* Check if the worker has started. */
/* Check worker status. */
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
worker = logicalrep_worker_find(subid);
if (!worker || worker->proc)
/*
* Worker is no longer associated with subscription. It must have
* exited, nothing more for us to do.
*/
if (worker->subid == InvalidOid)
{
LWLockRelease(LogicalRepWorkerLock);
return;
}
/* Worker has assigned proc, so it has started. */
if (worker->proc)
break;
}

View File

@ -1218,6 +1218,22 @@ reread_subscription(void)
newsub = GetSubscription(MyLogicalRepWorker->subid, true);
/*
* Exit if the subscription was removed.
* This normally should not happen as the worker gets killed
* during DROP SUBSCRIPTION.
*/
if (!newsub)
{
ereport(LOG,
(errmsg("logical replication worker for subscription \"%s\" will "
"stop because the subscription was removed",
MySubscription->name)));
walrcv_disconnect(wrconn);
proc_exit(0);
}
/*
* Exit if connection string was changed. The launcher will start
* new worker.
@ -1248,22 +1264,6 @@ reread_subscription(void)
proc_exit(0);
}
/*
* Exit if the subscription was removed.
* This normally should not happen as the worker gets killed
* during DROP SUBSCRIPTION.
*/
if (!newsub)
{
ereport(LOG,
(errmsg("logical replication worker for subscription \"%s\" will "
"stop because the subscription was removed",
MySubscription->name)));
walrcv_disconnect(wrconn);
proc_exit(0);
}
/*
* Exit if the subscription was disabled.
* This normally should not happen as the worker gets killed