From: Magnus Hagander Date: Fri, 20 Jan 2012 12:57:02 +0000 (+0100) Subject: Check number of fields in IDENTIFY_SYSTEM response X-Git-Tag: REL9_2_BETA1~561 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c14534957bb93df76bc66516aa03476de0069213;p=postgresql Check number of fields in IDENTIFY_SYSTEM response Jaime Casanova --- diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 40076802e5..aabbdac8d0 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -918,10 +918,10 @@ BaseBackup(void) progname, PQerrorMessage(conn)); disconnect_and_exit(1); } - if (PQntuples(res) != 1) + if (PQntuples(res) != 1 || PQnfields(res) != 3) { - fprintf(stderr, _("%s: could not identify system, got %i rows\n"), - progname, PQntuples(res)); + fprintf(stderr, _("%s: could not identify system, got %i rows and %i fields\n"), + progname, PQntuples(res), PQnfields(res)); disconnect_and_exit(1); } sysidentifier = strdup(PQgetvalue(res, 0, 0)); @@ -1130,7 +1130,7 @@ BaseBackup(void) { fprintf(stderr, _("%s: could not parse xlog end position \"%s\"\n"), progname, xlogend); - exit(1); + disconnect_and_exit(1); } InterlockedIncrement(&has_xlogendptr); @@ -1162,6 +1162,7 @@ BaseBackup(void) /* * End of copy data. Final result is already checked inside the loop. */ + PQclear(res); PQfinish(conn); if (verbose) diff --git a/src/bin/pg_basebackup/pg_receivexlog.c b/src/bin/pg_basebackup/pg_receivexlog.c index e698b06b7d..fe9e39bb21 100644 --- a/src/bin/pg_basebackup/pg_receivexlog.c +++ b/src/bin/pg_basebackup/pg_receivexlog.c @@ -235,10 +235,10 @@ StreamLog(void) progname, PQerrorMessage(conn)); disconnect_and_exit(1); } - if (PQntuples(res) != 1) + if (PQntuples(res) != 1 || PQnfields(res) != 3) { - fprintf(stderr, _("%s: could not identify system, got %i rows\n"), - progname, PQntuples(res)); + fprintf(stderr, _("%s: could not identify system, got %i rows and %i fields\n"), + progname, PQntuples(res), PQnfields(res)); disconnect_and_exit(1); } timeline = atoi(PQgetvalue(res, 0, 1)); diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index c390cbf13d..8ca3882a72 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -235,6 +235,13 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline, char *sysi PQclear(res); return false; } + if (PQnfields(res) != 3 || PQntuples(res) != 1) + { + fprintf(stderr, _("%s: could not identify system, got %i rows and %i fields\n"), + progname, PQntuples(res), PQnfields(res)); + PQclear(res); + return false; + } if (strcmp(sysidentifier, PQgetvalue(res, 0, 0)) != 0) { fprintf(stderr, _("%s: system identifier does not match between base backup and streaming connection\n"), progname);