From a92ea0245451327c386bfe17d82c60b6dd1681b2 Mon Sep 17 00:00:00 2001 From: "pengbo@sraoss.co.jp" Date: Fri, 6 Mar 2020 07:46:18 +0900 Subject: [PATCH] Fix watchdog ping probes fail with long hostnames due to small buffer. per 516. --- src/watchdog/wd_ping.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/watchdog/wd_ping.c b/src/watchdog/wd_ping.c index 67e9ecbe4..d9dc9810b 100644 --- a/src/watchdog/wd_ping.c +++ b/src/watchdog/wd_ping.c @@ -6,7 +6,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2016 PgPool Global Development Group + * Copyright (c) 2003-2020 PgPool Global Development Group * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -174,28 +174,31 @@ wd_get_ping_result(char *hostname, int exit_status, int outfd) } else { - char result[WD_MAX_PING_RESULT]; - int i = 0; - int r_size = 0; + StringInfoData result; + char buf[WD_MAX_PING_RESULT]; + int r_size = 0; ereport(DEBUG1, (errmsg("watchdog ping process for host \"%s\" exited successfully", hostname))); - while (((r_size = read(outfd, &result[i], sizeof(result) - i - 1)) > 0) && (errno == EINTR)) + initStringInfo(&result); + while ((r_size = read(outfd, &buf, sizeof(buf) - 1)) > 0) { - i += r_size; + buf[r_size] = '\0'; + appendStringInfoString(&result, buf); } - result[sizeof(result) - 1] = '\0'; /* Check whether average RTT >= 0 */ - if (get_result(result) >= 0) + if (get_result(result.data) >= 0) { ereport(DEBUG1, (errmsg("watchdog succeeded to ping a host \"%s\"", hostname))); + pfree(result.data); return true; } ereport(WARNING, (errmsg("ping host\"%s\" failed", hostname), errdetail("average RTT value is not greater than zero"))); + pfree(result.data); } return false; } -- 2.39.5