Hi all, After looking at Alvaro's message mentioning the handling of PQsocket() for invalid sockets, I just had a look by curiosity at other calls of this routine, and found a couple of issues: 1) In vacuumdb.c, init_slot() does not check for the return value of PQsocket(): slot->sock = PQsocket(conn); 2) In isolationtester.c, try_complete_step() should do the same. 3) In pg_recvlogical.c for StreamLogicalLog() I am spotting the same problem. I guess those ones should be fixed as well, no?
The patch attached addresses those issues. This has been raised in this message, but beginning a new thread makes more sense: http://www.postgresql.org/message-id/cab7npqttzoiuvygnonlvnzysstusofhkeo9ftrqbkwj36uc...@mail.gmail.com Regards, -- Michael
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index 832f9f9..b4325b0 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -360,6 +360,14 @@ StreamLogicalLog(void) struct timeval timeout; struct timeval *timeoutptr = NULL; + if (PQsocket(conn) < 0) + { + fprintf(stderr, + _("%s: bad socket: \"%s\"\n"), + progname, strerror(errno)); + goto error; + } + FD_ZERO(&input_mask); FD_SET(PQsocket(conn), &input_mask); diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index c6afcd5..e81123f 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -70,7 +70,7 @@ static void DisconnectDatabase(ParallelSlot *slot); static int select_loop(int maxFd, fd_set *workerset, bool *aborting); -static void init_slot(ParallelSlot *slot, PGconn *conn); +static void init_slot(ParallelSlot *slot, PGconn *conn, const char *progname); static void help(const char *progname); @@ -421,14 +421,14 @@ vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, * array contains the connection. */ slots = (ParallelSlot *) pg_malloc(sizeof(ParallelSlot) * concurrentCons); - init_slot(slots, conn); + init_slot(slots, conn, progname); if (parallel) { for (i = 1; i < concurrentCons; i++) { conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false, true); - init_slot(slots + i, conn); + init_slot(slots + i, conn, progname); } } @@ -917,11 +917,18 @@ select_loop(int maxFd, fd_set *workerset, bool *aborting) } static void -init_slot(ParallelSlot *slot, PGconn *conn) +init_slot(ParallelSlot *slot, PGconn *conn, const char *progname) { slot->connection = conn; slot->isFree = true; slot->sock = PQsocket(conn); + + if (slot->sock < 0) + { + fprintf(stderr, _("%s: bad socket: %s\n"), progname, + strerror(errno)); + exit(1); + } } static void diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c index 0a9d25c..3e13a39 100644 --- a/src/test/isolation/isolationtester.c +++ b/src/test/isolation/isolationtester.c @@ -720,6 +720,12 @@ try_complete_step(Step *step, int flags) PGresult *res; bool canceled = false; + if (sock < 0) + { + fprintf(stderr, "bad socket: %s\n", strerror(errno)); + exit_nicely(); + } + gettimeofday(&start_time, NULL); FD_ZERO(&read_set);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers