Add buffer length check.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 2 Jul 2021 03:50:29 +0000 (12:50 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 2 Jul 2021 05:40:57 +0000 (14:40 +0900)
get_info_from_conninfo() did not check the size of the provided
buffers.  Add length parameters so that it can check the buffer size.

src/main/pgpool_main.c

index ab5f23785ae7b9fcbb3772304d54c9dc0e7b40b0..d3e593af1e7d911ce6a9a6ab66cc1b3cd5ad4add 100644 (file)
@@ -151,7 +151,7 @@ static char *process_name_from_pid(pid_t pid);
 static void sync_backend_from_watchdog(void);
 static void update_backend_quarantine_status(void);
 static int     get_server_version(POOL_CONNECTION_POOL_SLOT * *slots, int node_id);
-static void get_info_from_conninfo(char *conninfo, char *host, char *port);
+static void get_info_from_conninfo(char *conninfo, char *host, int hostlen, char *port, int portlen);
 
 static struct sockaddr_un un_addr;     /* unix domain socket path */
 static struct sockaddr_un pcp_un_addr; /* unix domain socket path for PCP */
@@ -3009,7 +3009,7 @@ verify_backend_node_status(POOL_CONNECTION_POOL_SLOT * *slots)
                bool            check_connectivity = false;
                int                     wal_receiver_status = 0;
                int                     wal_receiver_conninfo = 1;
-               char            host[1024];
+               char            host[MAX_DB_HOST_NAMELEN];
                char            port[1024];
                int                     primary[MAX_NUM_BACKENDS];
                int                     true_primary = -1;
@@ -3103,7 +3103,7 @@ verify_backend_node_status(POOL_CONNECTION_POOL_SLOT * *slots)
                                                                        (errmsg("verify_backend_node_status: pg_stat_wal_receiver conninfo for standby %d is NULL", j)));
                                                        continue;
                                                }
-                                               get_info_from_conninfo(res->data[wal_receiver_conninfo], host, port);
+                                               get_info_from_conninfo(res->data[wal_receiver_conninfo], host, sizeof(host), port, sizeof(port));
                                                ereport(DEBUG1,
                                                                (errmsg("verify_backend_node_status: conninfo for standby %d is === %s ===. host:%s port:%s", j, res->data[wal_receiver_conninfo], host, port)));
                                                free_select_result(res);
@@ -4295,7 +4295,7 @@ get_server_version(POOL_CONNECTION_POOL_SLOT * *slots, int node_id)
  * Get info from conninfo string.
  */
 static void
-get_info_from_conninfo(char *conninfo, char *host, char *port)
+get_info_from_conninfo(char *conninfo, char *host, int hostlen, char *port, int portlen)
 {
        char       *p;
 
@@ -4309,7 +4309,7 @@ get_info_from_conninfo(char *conninfo, char *host, char *port)
                while (*p && *p++ != '=')
                        ;
 
-               while (*p && *p != ' ')
+               while (*p && hostlen-- && *p != ' ')
                        *host++ = *p++;
                *host = '\0';
        }
@@ -4321,7 +4321,7 @@ get_info_from_conninfo(char *conninfo, char *host, char *port)
                while (*p && *p++ != '=')
                        ;
 
-               while (*p && *p != ' ')
+               while (*p && portlen-- && *p != ' ')
                        *port++ = *p++;
                *port = '\0';
        }