aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorJeff Davis <jdavis@postgresql.org>2024-01-12 13:41:36 -0800
committerJeff Davis <jdavis@postgresql.org>2024-01-12 13:41:36 -0800
commit5c31669058b5550b4b3d623c07bc4203c11b8316 (patch)
treea4b14e4019276cd67e5c5d93a3bad14f2d6710e1 /src/backend
parenta1604237a6ffee70b171bacd5f36b0e380afd33a (diff)
downloadpostgresql-5c31669058b5550b4b3d623c07bc4203c11b8316.tar.gz
postgresql-5c31669058b5550b4b3d623c07bc4203c11b8316.zip
Re-validate connection string in libpqrcv_connect().
A superuser may create a subscription with password_required=true, but which uses a connection string without a password. Previously, if the owner of such a subscription was changed to a non-superuser, the non-superuser was able to utilize a password from another source (like a password file or the PGPASSWORD environment variable), which should not have been allowed. This commit adds a step to re-validate the connection string before connecting. Reported-by: Jeff Davis Author: Vignesh C Reviewed-by: Peter Smith, Robert Haas, Amit Kapila Discussion: https://www.postgresql.org/message-id/flat/e5892973ae2a80a1a3e0266806640dae3c428100.camel%40j-davis.com Backpatch-through: 16
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/replication/libpqwalreceiver/libpqwalreceiver.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index 78344a03615..ead30f87c96 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -138,6 +138,15 @@ libpqrcv_connect(const char *conninfo, bool logical, bool must_use_password,
int i = 0;
/*
+ * Re-validate connection string. The validation already happened at DDL
+ * time, but the subscription owner may have changed. If we don't recheck
+ * with the correct must_use_password, it's possible that the connection
+ * will obtain the password from a different source, such as PGPASSFILE or
+ * PGPASSWORD.
+ */
+ libpqrcv_check_conninfo(conninfo, must_use_password);
+
+ /*
* We use the expand_dbname parameter to process the connection string (or
* URI), and pass some extra options.
*/