提交 7627b91c 编写于 作者: T Tom Lane

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.
上级 3fdd33ab
......@@ -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,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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册