Commit 70c56a01 authored by Peter Eisentraut's avatar Peter Eisentraut

Fix NULL pointer access in logical replication workers

From: Petr Jelinek <pjmodos@pjmodos.net>
parent 6cffe54a
...@@ -349,10 +349,21 @@ logicalrep_worker_stop(Oid subid) ...@@ -349,10 +349,21 @@ logicalrep_worker_stop(Oid subid)
ResetLatch(&MyProc->procLatch); ResetLatch(&MyProc->procLatch);
/* Check if the worker has started. */ /* Check worker status. */
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); 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; break;
} }
......
...@@ -1219,14 +1219,15 @@ reread_subscription(void) ...@@ -1219,14 +1219,15 @@ reread_subscription(void)
newsub = GetSubscription(MyLogicalRepWorker->subid, true); newsub = GetSubscription(MyLogicalRepWorker->subid, true);
/* /*
* Exit if connection string was changed. The launcher will start * Exit if the subscription was removed.
* new worker. * This normally should not happen as the worker gets killed
* during DROP SUBSCRIPTION.
*/ */
if (strcmp(newsub->conninfo, MySubscription->conninfo) != 0) if (!newsub)
{ {
ereport(LOG, ereport(LOG,
(errmsg("logical replication worker for subscription \"%s\" will " (errmsg("logical replication worker for subscription \"%s\" will "
"restart because the connection information was changed", "stop because the subscription was removed",
MySubscription->name))); MySubscription->name)));
walrcv_disconnect(wrconn); walrcv_disconnect(wrconn);
...@@ -1234,14 +1235,14 @@ reread_subscription(void) ...@@ -1234,14 +1235,14 @@ reread_subscription(void)
} }
/* /*
* Exit if publication list was changed. The launcher will start * Exit if connection string was changed. The launcher will start
* new worker. * new worker.
*/ */
if (!equal(newsub->publications, MySubscription->publications)) if (strcmp(newsub->conninfo, MySubscription->conninfo) != 0)
{ {
ereport(LOG, ereport(LOG,
(errmsg("logical replication worker for subscription \"%s\" will " (errmsg("logical replication worker for subscription \"%s\" will "
"restart because subscription's publications were changed", "restart because the connection information was changed",
MySubscription->name))); MySubscription->name)));
walrcv_disconnect(wrconn); walrcv_disconnect(wrconn);
...@@ -1249,15 +1250,14 @@ reread_subscription(void) ...@@ -1249,15 +1250,14 @@ reread_subscription(void)
} }
/* /*
* Exit if the subscription was removed. * Exit if publication list was changed. The launcher will start
* This normally should not happen as the worker gets killed * new worker.
* during DROP SUBSCRIPTION.
*/ */
if (!newsub) if (!equal(newsub->publications, MySubscription->publications))
{ {
ereport(LOG, ereport(LOG,
(errmsg("logical replication worker for subscription \"%s\" will " (errmsg("logical replication worker for subscription \"%s\" will "
"stop because the subscription was removed", "restart because subscription's publications were changed",
MySubscription->name))); MySubscription->name)));
walrcv_disconnect(wrconn); walrcv_disconnect(wrconn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment