Fix sefault in pgpool child process in certain case.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 21 Aug 2020 10:51:04 +0000 (19:51 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Fri, 21 Aug 2020 11:13:07 +0000 (20:13 +0900)
When all backend go down, pgpool refuses to accept connection from
clients and try to send a message in
validate_backend_connectivity(). For this purpose it connects to the
client and try to read the startup packet. This is done in a PG_TRY
block. The startup packet is read in memory pointed to by "sp", which
is declared as "StartupPacket *volatile". This is fine. But it was
forgotten to initialize the value with NULL. As a result, if reading
startup packet fails, sp would be garbage a pointer and segfaults later
in pool_free_startup_packet(sp).

Fix is, initialize "sp" with NULL.

I have found this accidentally in following way:

1) shutdown all backends.

2) connect to pgpool with invalid client. I have used pcp_attach_node
with pgpool's port number, not pcp's.

src/protocol/child.c

index 6956157e2d50618d79c4addedcced1362a4b5226..096ffd40742477ed2c9ec7d52ce487f64e9be776 100644 (file)
@@ -2205,7 +2205,7 @@ static void validate_backend_connectivity(int front_end_fd)
                if(front_end_fd > 0)
                {
                        POOL_CONNECTION *cp;
-                       StartupPacket *volatile sp;
+                       StartupPacket *volatile sp = NULL;
 
                        /* 
              * we do not want to report socket error, as above errors