Fix another segmentation fault.
authorTatsuo Ishii <ishii@postgresql.org>
Mon, 22 Jul 2024 10:32:41 +0000 (19:32 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Mon, 22 Jul 2024 10:32:41 +0000 (19:32 +0900)
It is reported that pgpool child segfaulted in pool_do_auth. The cause
was MAIN_CONNECTION() returns NULL. It seems my_main_node_id was set
to incorrect node id 0, which was actually in down status. thus there
was no connection in cp->slots[0]. In this particular case a client
connected to pgpool while failover occurred in another pgpool node,
and it was propagated by watchdog, which changed backend_status in
shared memory. new_connection() properly updates my_backend_status but
it forgot to update my_main_node_id, and MAIN_CONNECTION returned
incorrect backend id.

Problem reported by: Emond Papegaaij
Discussion: [pgpool-general: 9175] Segmentation fault
https://www.pgpool.net/pipermail/pgpool-general/2024-July/001852.html
Backpatch-through: V4.1.

src/protocol/pool_connection_pool.c

index c0d65c39bfbd262f5f0217d5f06d84da11cda331..79ee7e786423a35d3a9b8988fde99fb33d936948 100644 (file)
@@ -5,7 +5,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2023     PgPool Global Development Group
+ * Copyright (c) 2003-2024     PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -919,6 +919,7 @@ static POOL_CONNECTION_POOL * new_connection(POOL_CONNECTION_POOL * p)
 
                        /* sync local status with global status */
                        *(my_backend_status[i]) = status;
+                       my_main_node_id = Req_info->main_node_id;
                        continue;
                }