Set the close-on-exec flag for libpq's socket to the backend, to avoid
authorTom Lane
Thu, 21 Oct 2004 20:23:19 +0000 (20:23 +0000)
committerTom Lane
Thu, 21 Oct 2004 20:23:19 +0000 (20:23 +0000)
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

index 76f811e28f29622bb94f75d71f0432dde766fa37..852247ce3234b02c7ceb39ccd5cf50eb6b333be4 100644 (file)
@@ -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"
 #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,