aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2025-02-10 16:30:03 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2025-02-10 16:30:54 -0500
commit9862de9176ef161e20a40f327afe18c6a11ecdcc (patch)
treeb7549d6efd9b42d5e1b191d70d0c73b8d78367e7
parenta085fa73169d6c0df079cfa4ddfeade812368a64 (diff)
downloadpostgresql-9862de9176ef161e20a40f327afe18c6a11ecdcc.tar.gz
postgresql-9862de9176ef161e20a40f327afe18c6a11ecdcc.zip
Adapt appendPsqlMetaConnect() to the new fmtId() encoding expectations.
We need to tell fmtId() what encoding to assume, but this function doesn't know that. Fortunately we can fix that without changing the function's API, because we can just use SQL_ASCII. That's because database names in connection requests are effectively binary not text: no encoding-aware processing will happen on them. This fixes XversionUpgrade failures seen in the buildfarm. The alternative of having pg_upgrade use setFmtEncoding() is unappetizing, given that it's connecting to multiple databases that may have different encodings. Andres Freund, Noah Misch, Tom Lane Security: CVE-2025-1094
-rw-r--r--src/fe_utils/string_utils.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c
index 99128d74160..78f6df24089 100644
--- a/src/fe_utils/string_utils.c
+++ b/src/fe_utils/string_utils.c
@@ -790,29 +790,38 @@ appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname)
}
}
- appendPQExpBufferStr(buf, "\\connect ");
if (complex)
{
PQExpBufferData connstr;
initPQExpBuffer(&connstr);
+
+ /*
+ * Force the target psql's encoding to SQL_ASCII. We don't really
+ * know the encoding of the database name, and it doesn't matter as
+ * long as psql will forward it to the server unchanged.
+ */
+ appendPQExpBufferStr(buf, "\\encoding SQL_ASCII\n");
+ appendPQExpBufferStr(buf, "\\connect -reuse-previous=on ");
+
appendPQExpBufferStr(&connstr, "dbname=");
appendConnStrVal(&connstr, dbname);
- appendPQExpBufferStr(buf, "-reuse-previous=on ");
-
/*
* As long as the name does not contain a newline, SQL identifier
* quoting satisfies the psql meta-command parser. Prefer not to
* involve psql-interpreted single quotes, which behaved differently
* before PostgreSQL 9.2.
*/
- appendPQExpBufferStr(buf, fmtId(connstr.data));
+ appendPQExpBufferStr(buf, fmtIdEnc(connstr.data, PG_SQL_ASCII));
termPQExpBuffer(&connstr);
}
else
- appendPQExpBufferStr(buf, fmtId(dbname));
+ {
+ appendPQExpBufferStr(buf, "\\connect ");
+ appendPQExpBufferStr(buf, fmtIdEnc(dbname, PG_SQL_ASCII));
+ }
appendPQExpBufferChar(buf, '\n');
}