postgres.git / summary / log / commit / refs

commit    5bace41abc317ae8ecf3397e9e92f3b0e5444c69
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Tue Feb 21 11:02:09 2023 +0000
First released in: 16.0, 15.3

    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


contrib/postgres_fdw/option.c | 22 ++++++++++++++++++---- 1 file 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 */ [parent: 108a22bd14d4]