Skip to content

Commit 70c56a0

Browse files
committed
Fix NULL pointer access in logical replication workers
From: Petr Jelinek <pjmodos@pjmodos.net>
1 parent 6cffe54 commit 70c56a0

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

src/backend/replication/logical/launcher.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,10 +349,21 @@ logicalrep_worker_stop(Oid subid)
349349

350350
ResetLatch(&MyProc->procLatch);
351351

352-
/* Check if the worker has started. */
352+
/* Check worker status. */
353353
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
354-
worker = logicalrep_worker_find(subid);
355-
if (!worker || worker->proc)
354+
355+
/*
356+
* Worker is no longer associated with subscription. It must have
357+
* exited, nothing more for us to do.
358+
*/
359+
if (worker->subid == InvalidOid)
360+
{
361+
LWLockRelease(LogicalRepWorkerLock);
362+
return;
363+
}
364+
365+
/* Worker has assigned proc, so it has started. */
366+
if (worker->proc)
356367
break;
357368
}
358369

src/backend/replication/logical/worker.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,45 +1219,45 @@ reread_subscription(void)
12191219
newsub = GetSubscription(MyLogicalRepWorker->subid, true);
12201220

12211221
/*
1222-
* Exit if connection string was changed. The launcher will start
1223-
* new worker.
1222+
* Exit if the subscription was removed.
1223+
* This normally should not happen as the worker gets killed
1224+
* during DROP SUBSCRIPTION.
12241225
*/
1225-
if (strcmp(newsub->conninfo, MySubscription->conninfo) != 0)
1226+
if (!newsub)
12261227
{
12271228
ereport(LOG,
12281229
(errmsg("logical replication worker for subscription \"%s\" will "
1229-
"restart because the connection information was changed",
1230+
"stop because the subscription was removed",
12301231
MySubscription->name)));
12311232

12321233
walrcv_disconnect(wrconn);
12331234
proc_exit(0);
12341235
}
12351236

12361237
/*
1237-
* Exit if publication list was changed. The launcher will start
1238+
* Exit if connection string was changed. The launcher will start
12381239
* new worker.
12391240
*/
1240-
if (!equal(newsub->publications, MySubscription->publications))
1241+
if (strcmp(newsub->conninfo, MySubscription->conninfo) != 0)
12411242
{
12421243
ereport(LOG,
12431244
(errmsg("logical replication worker for subscription \"%s\" will "
1244-
"restart because subscription's publications were changed",
1245+
"restart because the connection information was changed",
12451246
MySubscription->name)));
12461247

12471248
walrcv_disconnect(wrconn);
12481249
proc_exit(0);
12491250
}
12501251

12511252
/*
1252-
* Exit if the subscription was removed.
1253-
* This normally should not happen as the worker gets killed
1254-
* during DROP SUBSCRIPTION.
1253+
* Exit if publication list was changed. The launcher will start
1254+
* new worker.
12551255
*/
1256-
if (!newsub)
1256+
if (!equal(newsub->publications, MySubscription->publications))
12571257
{
12581258
ereport(LOG,
12591259
(errmsg("logical replication worker for subscription \"%s\" will "
1260-
"stop because the subscription was removed",
1260+
"restart because subscription's publications were changed",
12611261
MySubscription->name)));
12621262

12631263
walrcv_disconnect(wrconn);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy