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.
This commit is contained in:
Tom Lane 2004-10-21 20:23:19 +00:00
parent 3fdd33ab99
commit 7627b91cd5
1 changed files with 26 additions and 27 deletions

View 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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>
#include <unistd.h>
#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,14 +1197,30 @@ 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,
* since we are in nonblock mode. If it does, well,