pgpool2.git / summary / log / commit / refs
commit a89b8ac5d906d03f2fe3d2628c0705330bd282f5
Author: Yugo Nagata <nagata@sraoss.co.jp>
Date: Mon Jul 08 01:23:25 2013 +0000
Fix to verify the backend node number in pcp_recovery_node
When an invalid number is used, null value is passed as an arguments
of recovery script, and this causes a malfunction. In especially,
rsync may delete unrelated files in basebackup scripts.
pcp_child.c | 16 ++++++++++++++++
recovery.c | 7 +++++++
2 files changed, 23 insertions(+)
diff --git a/pcp_child.c b/pcp_child.c
index f87f61d81..b279071f7 100644
--- a/pcp_child.c
+++ b/pcp_child.c
@@ -835,6 +835,22 @@ pcp_do_child(int unix_fd, int inet_fd, char *pcp_conf_file)
node_id = atoi(buf);
+ if ( (node_id < 0) || (node_id >= pool_config->backend_desc->num_backends) )
+ {
+ char code[] = "NodeIdOutOfRange";
+ pool_error("pcp_child: node id %d is not valid", node_id);
+ pcp_write(frontend, "e", 1);
+ wsize = htonl(sizeof(code) + sizeof(int));
+ pcp_write(frontend, &wsize, sizeof(int));
+ pcp_write(frontend, code, sizeof(code));
+ if (pcp_flush(frontend) < 0)
+ {
+ pool_error("pcp_child: pcp_flush() failed. reason: %s", strerror(errno));
+ exit(1);
+ }
+ exit(1);
+ }
+
if ((!REPLICATION &&
!(MASTER_SLAVE &&
!strcmp(pool_config->master_slave_sub_mode, MODE_STREAMREP))) ||
diff --git a/recovery.c b/recovery.c
index 6886f3c5e..420699bde 100644
--- a/recovery.c
+++ b/recovery.c
@@ -66,8 +66,15 @@ int start_recovery(int recovery_node)
pool_log("starting recovering node %d", recovery_node);
+ if ( (recovery_node < 0) || (recovery_node >= pool_config->backend_desc->num_backends) )
+ {
+ pool_error("start_recovery: node id %d is not valid", recovery_node);
+ return 1;
+ }
+
if (VALID_BACKEND(recovery_node))
{
+
pool_error("start_recovery: backend node %d is alive", recovery_node);
return 1;
}
[parent: 8b803e1ea38c]