From 7627b91cd5d9a35415ecb15a55ea46d6b481700c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 21 Oct 2004 20:23:19 +0000 Subject: [PATCH] Set the close-on-exec flag for libpq's socket to the backend, to avoid any possible problems from child programs executed by the client app. Per suggestion from Elliot Lee of Red Hat. --- src/interfaces/libpq/fe-connect.c | 53 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 76f811e28f..852247ce32 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.285 2004/10/16 22:52:49 tgl Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.286 2004/10/21 20:23:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,9 +18,9 @@ #include #include #include -#include #include #include +#include #ifndef HAVE_STRDUP #include "strdup.h" @@ -51,6 +51,11 @@ #include "libpq/ip.h" #include "mb/pg_wchar.h" +#ifndef FD_CLOEXEC +#define FD_CLOEXEC 1 +#endif + + #define PGPASSFILE ".pgpass" /* fall back options if they are not specified by arguments or defined @@ -766,28 +771,6 @@ update_db_info(PGconn *conn) #endif /* NOT_USED */ -/* ---------- - * connectMakeNonblocking - - * Make a connection non-blocking. - * Returns 1 if successful, 0 if not. - * ---------- - */ -static int -connectMakeNonblocking(PGconn *conn) -{ - if (!set_noblock(conn->sock)) - { - char sebuf[256]; - - printfPQExpBuffer(&conn->errorMessage, - libpq_gettext("could not set socket to non-blocking mode: %s\n"), - SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); - return 0; - } - - return 1; -} - /* ---------- * connectNoDelay - * Sets the TCP_NODELAY socket option. @@ -1201,8 +1184,8 @@ keep_going: /* We will come back to here until there /* * Select socket options: no delay of outgoing data - * for TCP sockets, and nonblock mode. Fail if this - * fails. + * for TCP sockets, nonblock mode, close-on-exec. + * Fail if any of this fails. */ if (!IS_AF_UNIX(addr_cur->ai_family)) { @@ -1214,13 +1197,29 @@ keep_going: /* We will come back to here until there continue; } } - if (connectMakeNonblocking(conn) == 0) + if (!set_noblock(conn->sock)) { + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not set socket to non-blocking mode: %s\n"), + SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); + closesocket(conn->sock); + conn->sock = -1; + conn->addr_cur = addr_cur->ai_next; + continue; + } + +#ifdef F_SETFD + if (fcntl(conn->sock, F_SETFD, FD_CLOEXEC) == -1) + { + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not set socket to close-on-exec mode: %s\n"), + SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); closesocket(conn->sock); conn->sock = -1; conn->addr_cur = addr_cur->ai_next; continue; } +#endif /* F_SETFD */ /* * Start/make connection. This should not block, -- GitLab