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]