]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix handling of escape sequences in postgres_fdw.application_name
authorMichael Paquier <michael@paquier.xyz>
Tue, 21 Feb 2023 11:02:09 +0000 (20:02 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 21 Feb 2023 11:02:09 +0000 (20:02 +0900)
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

contrib/postgres_fdw/option.c

index 707013263d0a4a70963f439548a52c02a70e3e77..2e0e8ee8b57ebc359da0d6b08ed6b1197fed08fd 100644 (file)
@@ -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 */