Fix possible logical replication crash.
authorRobert Haas <[email protected]>
Mon, 3 Apr 2023 17:11:00 +0000 (13:11 -0400)
committerRobert Haas <[email protected]>
Mon, 3 Apr 2023 17:54:21 +0000 (13:54 -0400)
Commit c3afe8cf5a1e465bd71e48e4bc717f5bfdc7a7d6 added a new
password_required option but forgot that you need database access
to check whether an arbitrary role ID is a superuser.

Report and patch by Hou Zhijie. I added a comment. Thanks to
Alexander Lakhin for devising a way to reproduce the crash.

Discussion: http://postgr.es/m/OS0PR01MB5716BFD7EC44284C89F40808948F9@OS0PR01MB5716.jpnprd01.prod.outlook.com

src/backend/replication/logical/worker.c

index 6fd674b5d60a8d8f1956be6a53e8c43c5b9aa332..ef2a6beb361dcb4652fcacba85124021378ab171 100644 (file)
@@ -4545,12 +4545,14 @@ ApplyWorkerMain(Datum main_arg)
                replorigin_session_setup(originid, 0);
                replorigin_session_origin = originid;
                origin_startpos = replorigin_session_get_progress(false);
-               CommitTransactionCommand();
 
                /* Is the use of a password mandatory? */
                must_use_password = MySubscription->passwordrequired &&
                        !superuser_arg(MySubscription->owner);
 
+               /* Note that the superuser_arg call can access the DB */
+               CommitTransactionCommand();
+
                LogRepWorkerWalRcvConn = walrcv_connect(MySubscription->conninfo, true,
                                                                                                must_use_password,
                                                                                                MySubscription->name, &err);