aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/option.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2023-02-21 20:02:09 +0900
committerMichael Paquier <michael@paquier.xyz>2023-02-21 20:02:09 +0900
commit5bace41abc317ae8ecf3397e9e92f3b0e5444c69 (patch)
treeff9abeeed128d14e5af2e913d7cc5ddb19ae6bf4 /contrib/postgres_fdw/option.c
parent108a22bd14d4deb98340deec422cfec6d3b37840 (diff)
downloadpostgresql-5bace41abc317ae8ecf3397e9e92f3b0e5444c69.tar.gz
postgresql-5bace41abc317ae8ecf3397e9e92f3b0e5444c69.zip
Fix handling of escape sequences in postgres_fdw.application_name
postgres_fdw.application_name relies on MyProcPort to define the data that should be added to escape sequences %u (user name) or %d (database name). However this code could be run in processes that lack a MyProcPort, like an autovacuum process, causing crashes. The code generating the application name is made more flexible with this commit, so as it now generates no data for %u and %d if MyProcPort is missing, and a simple "unknown" if MyProcPort exists, but the expected fields are not set. Reported-by: Alexander Lakhin Author: Kyotaro Horiguchi, Michael Paquier Reviewed-by: Hayato Kuroda, Masahiko Sawada Discussion: https://postgr.es/m/17789-8b31c5a4672b74d9@postgresql.org Backpatch-through: 15
Diffstat (limited to 'contrib/postgres_fdw/option.c')
-rw-r--r--contrib/postgres_fdw/option.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c
index 707013263d0..2e0e8ee8b57 100644
--- a/contrib/postgres_fdw/option.c
+++ b/contrib/postgres_fdw/option.c
@@ -461,8 +461,6 @@ process_pgfdw_appname(const char *appname)
const char *p;
StringInfoData buf;
- Assert(MyProcPort != NULL);
-
initStringInfo(&buf);
for (p = appname; *p != '\0'; p++)
@@ -498,13 +496,29 @@ process_pgfdw_appname(const char *appname)
appendStringInfoString(&buf, cluster_name);
break;
case 'd':
- appendStringInfoString(&buf, MyProcPort->database_name);
+ if (MyProcPort)
+ {
+ const char *dbname = MyProcPort->database_name;
+
+ if (dbname)
+ appendStringInfoString(&buf, dbname);
+ else
+ appendStringInfoString(&buf, "[unknown]");
+ }
break;
case 'p':
appendStringInfo(&buf, "%d", MyProcPid);
break;
case 'u':
- appendStringInfoString(&buf, MyProcPort->user_name);
+ if (MyProcPort)
+ {
+ const char *username = MyProcPort->user_name;
+
+ if (username)
+ appendStringInfoString(&buf, username);
+ else
+ appendStringInfoString(&buf, "[unknown]");
+ }
break;
default:
/* format error - ignore it */