

--- 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]");

