--- postgresql-9.5.19/src/include/libpq/libpq-be.h +++ postgresql-9.5.19/src/include/libpq/libpq-be.h @@ -139,6 +139,8 @@ char *user_name; char *cmdline_options; List *guc_options; + char *application_name; /* * Information that needs to be held during the authentication cycle. --- postgresql-9.5.19/src/include/common/string.h +++ postgresql-9.5.19/src/include/common/string.h @@ -11,5 +11,6 @@ #define COMMON_STRING_H extern bool pg_str_endswith(const char *str, const char *end); +extern void pg_clean_ascii(char *str); #endif /* COMMON_STRING_H */ --- postgresql-9.5.19/src/common/string.c +++ postgresql-9.5.19/src/common/string.c @@ -41,3 +41,16 @@ str += slen - elen; return strcmp(str, end) == 0; } + +void +pg_clean_ascii(char *str) +{ +/* Only allow clean ASCII chars in the string */ + char *p; + + for (p = str; *p != '\0'; p++) + { + if (*p < 32 || *p > 126) + *p = '?'; + } +} --- postgresql-9.5.19/src/backend/postmaster/postmaster.c +++ postgresql-9.5.19/src/backend/postmaster/postmaster.c @@ -95,6 +95,7 @@ #include "access/xlog.h" #include "bootstrap/bootstrap.h" #include "catalog/pg_control.h" +#include "common/string.h" #include "lib/ilist.h" #include "libpq/auth.h" #include "libpq/ip.h" @@ -2094,6 +2095,16 @@ pstrdup(nameptr)); port->guc_options = lappend(port->guc_options, pstrdup(valptr)); + + if (strcmp(nameptr, "application_name") == 0) + { + char *tmp_app_name = pstrdup(valptr); + pg_clean_ascii(tmp_app_name); + port->application_name = tmp_app_name; + } + } offset = valoffset + strlen(valptr) + 1; } --- postgresql-9.5.19/src/backend/utils/error/elog.c +++ postgresql-9.5.19/src/backend/utils/error/elog.c @@ -2354,7 +2354,9 @@ case 'a': if (MyProcPort) { - const char *appname = application_name; + + // ereport(LOG, (errmsg(" ++ MyProcPort : [%s] ", application_name))); + const char *appname = MyProcPort->application_name; if (appname == NULL || *appname == '\0') appname = _("[unknown]");