Skip to content

Commit 5df4e16

Browse files
committed
Specify the encoding of input to fmtId()
This commit adds fmtIdEnc() and fmtQualifiedIdEnc(), which allow to specify the encoding as an explicit argument. Additionally setFmtEncoding() is provided, which defines the encoding when no explicit encoding is provided, to avoid breaking all code using fmtId(). All users of fmtId()/fmtQualifiedId() are either converted to the explicit version or a call to setFmtEncoding() has been added. This commit does not yet utilize the now well-defined encoding, that will happen in a subsequent commit. Reviewed-by: Noah Misch <noah@leadboat.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Backpatch-through: 13 Security: CVE-2025-1094
1 parent db3eb0e commit 5df4e16

File tree

13 files changed

+110
-21
lines changed

13 files changed

+110
-21
lines changed

src/bin/pg_dump/pg_backup_archiver.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,6 +2725,7 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
27252725
fatal("unrecognized encoding \"%s\"",
27262726
ptr1);
27272727
AH->public.encoding = encoding;
2728+
setFmtEncoding(encoding);
27282729
}
27292730
else
27302731
fatal("invalid ENCODING item: %s",

src/bin/pg_dump/pg_dump.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,6 +1094,7 @@ setup_connection(Archive *AH, const char *dumpencoding,
10941094
* we know how to escape strings.
10951095
*/
10961096
AH->encoding = PQclientEncoding(conn);
1097+
setFmtEncoding(AH->encoding);
10971098

10981099
std_strings = PQparameterStatus(conn, "standard_conforming_strings");
10991100
AH->std_strings = (std_strings && strcmp(std_strings, "on") == 0);

src/bin/pg_dump/pg_dumpall.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ main(int argc, char *argv[])
507507
* we know how to escape strings.
508508
*/
509509
encoding = PQclientEncoding(conn);
510+
setFmtEncoding(encoding);
510511
std_strings = PQparameterStatus(conn, "standard_conforming_strings");
511512
if (!std_strings)
512513
std_strings = "off";

src/bin/psql/command.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,7 @@ exec_command_encoding(PsqlScanState scan_state, bool active_branch)
12201220
/* save encoding info into psql internal data */
12211221
pset.encoding = PQclientEncoding(pset.db);
12221222
pset.popt.topt.encoding = pset.encoding;
1223+
setFmtEncoding(pset.encoding);
12231224
SetVariable(pset.vars, "ENCODING",
12241225
pg_encoding_to_char(pset.encoding));
12251226
}
@@ -3606,6 +3607,8 @@ SyncVariables(void)
36063607
pset.popt.topt.encoding = pset.encoding;
36073608
pset.sversion = PQserverVersion(pset.db);
36083609

3610+
setFmtEncoding(pset.encoding);
3611+
36093612
SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
36103613
SetVariable(pset.vars, "USER", PQuser(pset.db));
36113614
SetVariable(pset.vars, "HOST", PQhost(pset.db));

src/bin/scripts/common.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,9 @@ appendQualifiedRelation(PQExpBuffer buf, const char *spec,
430430
exit(1);
431431
}
432432
appendPQExpBufferStr(buf,
433-
fmtQualifiedId(PQgetvalue(res, 0, 1),
434-
PQgetvalue(res, 0, 0)));
433+
fmtQualifiedIdEnc(PQgetvalue(res, 0, 1),
434+
PQgetvalue(res, 0, 0),
435+
PQclientEncoding(conn)));
435436
appendPQExpBufferStr(buf, columns);
436437
PQclear(res);
437438
termPQExpBuffer(&sql);

src/bin/scripts/createdb.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ main(int argc, char *argv[])
190190

191191
conn = connectMaintenanceDatabase(&cparams, progname, echo);
192192

193+
setFmtEncoding(PQclientEncoding(conn));
194+
193195
initPQExpBuffer(&sql);
194196

195197
appendPQExpBuffer(&sql, "CREATE DATABASE %s",

src/bin/scripts/createuser.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ main(int argc, char *argv[])
266266

267267
conn = connectMaintenanceDatabase(&cparams, progname, echo);
268268

269+
setFmtEncoding(PQclientEncoding(conn));
270+
269271
initPQExpBuffer(&sql);
270272

271273
printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser));

src/bin/scripts/dropdb.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,6 @@ main(int argc, char *argv[])
127127
exit(0);
128128
}
129129

130-
initPQExpBuffer(&sql);
131-
132-
appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;",
133-
(if_exists ? "IF EXISTS " : ""),
134-
fmtId(dbname),
135-
force ? " WITH (FORCE)" : "");
136-
137130
/* Avoid trying to drop postgres db while we are connected to it. */
138131
if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
139132
maintenance_db = "template1";
@@ -147,6 +140,12 @@ main(int argc, char *argv[])
147140

148141
conn = connectMaintenanceDatabase(&cparams, progname, echo);
149142

143+
initPQExpBuffer(&sql);
144+
appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;",
145+
(if_exists ? "IF EXISTS " : ""),
146+
fmtIdEnc(dbname, PQclientEncoding(conn)),
147+
force ? " WITH (FORCE)" : "");
148+
150149
if (echo)
151150
printf("%s\n", sql.data);
152151
result = PQexec(conn, sql.data);

src/bin/scripts/dropuser.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ main(int argc, char *argv[])
143143

144144
initPQExpBuffer(&sql);
145145
appendPQExpBuffer(&sql, "DROP ROLE %s%s;",
146-
(if_exists ? "IF EXISTS " : ""), fmtId(dropuser));
146+
(if_exists ? "IF EXISTS " : ""),
147+
fmtIdEnc(dropuser, PQclientEncoding(conn)));
147148

148149
if (echo)
149150
printf("%s\n", sql.data);

src/bin/scripts/reindexdb.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,8 @@ run_reindex_command(PGconn *conn, ReindexType type, const char *name,
532532
{
533533
case REINDEX_DATABASE:
534534
case REINDEX_SYSTEM:
535-
appendPQExpBufferStr(&sql, fmtId(name));
535+
appendPQExpBufferStr(&sql,
536+
fmtIdEnc(name, PQclientEncoding(conn)));
536537
break;
537538
case REINDEX_INDEX:
538539
case REINDEX_TABLE:
@@ -702,8 +703,9 @@ get_parallel_object_list(PGconn *conn, ReindexType type,
702703
for (i = 0; i < ntups; i++)
703704
{
704705
appendPQExpBufferStr(&buf,
705-
fmtQualifiedId(PQgetvalue(res, i, 1),
706-
PQgetvalue(res, i, 0)));
706+
fmtQualifiedIdEnc(PQgetvalue(res, i, 1),
707+
PQgetvalue(res, i, 0),
708+
PQclientEncoding(conn)));
707709

708710
simple_string_list_append(tables, buf.data);
709711
resetPQExpBuffer(&buf);

0 commit comments

Comments
 (0)