v4-0004-Use-newer-client-socket-options-where-available.patch
text/x-patch
Filename: v4-0004-Use-newer-client-socket-options-where-available.patch
Type: text/x-patch
Part: 3
Patch
Format: format-patch
Series: patch v4-0004
Subject: Use newer client socket options where available.
| File | + | − |
|---|---|---|
| src/interfaces/libpq/fe-connect.c | 22 | 1 |
From fdae48117c9bc0d7d25eed09ec57710fda6c28ed Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Mon, 6 Feb 2023 14:54:03 +1300
Subject: [PATCH v4 4/5] Use newer client socket options where available.
As a recent commit did for the server side, we can now also try to set
client sockets to nonblocking and close-on-exit atomically when creating
the socket. This uses flags expected in the next POSIX revision, but
already widely available on common platforms.
This saves a couple of fcntl() calls, and plugs a tiny window for
resource leaks in multi-threaded programs that might fork-and-exec while
another thread would otherwise have to run socket() and then fcntl().
Discussion: https://postgr.es/m/CA%2BhUKGKb6FsAdQWcRL35KJsftv%2B9zXqQbzwkfRf1i0J2e57%2BhQ%40mail.gmail.com
---
src/interfaces/libpq/fe-connect.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 50b5df3490..953abc640f 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -2464,6 +2464,7 @@ keep_going: /* We will come back to here until there is
{
struct addrinfo *addr_cur = conn->addr_cur;
char host_addr[NI_MAXHOST];
+ int sock_type;
/*
* Advance to next possible host, if we've tried all of
@@ -2494,7 +2495,23 @@ keep_going: /* We will come back to here until there is
conn->connip = strdup(host_addr);
/* Try to create the socket */
- conn->sock = socket(addr_cur->ai_family, SOCK_STREAM, 0);
+ sock_type = SOCK_STREAM;
+#ifdef SOCK_CLOEXEC
+ /*
+ * Atomically mark close-on-exec, if possible on this
+ * platform, for the benefit of multi-threaded programs.
+ * Otherwise see below.
+ */
+ sock_type |= SOCK_CLOEXEC;
+#endif
+#ifdef SOCK_NONBLOCK
+ /*
+ * We might as well skip a system call for nonblocking
+ * mode too, if we can.
+ */
+ sock_type |= SOCK_NONBLOCK;
+#endif
+ conn->sock = socket(addr_cur->ai_family, sock_type, 0);
if (conn->sock == PGINVALID_SOCKET)
{
int errorno = SOCK_ERRNO;
@@ -2540,6 +2557,7 @@ keep_going: /* We will come back to here until there is
goto keep_going;
}
}
+#ifndef SOCK_NONBLOCK
if (!pg_set_noblock(conn->sock))
{
libpq_append_conn_error(conn, "could not set socket to nonblocking mode: %s",
@@ -2547,7 +2565,9 @@ keep_going: /* We will come back to here until there is
conn->try_next_addr = true;
goto keep_going;
}
+#endif
+#ifndef SOCK_CLOEXEC
#ifdef F_SETFD
if (fcntl(conn->sock, F_SETFD, FD_CLOEXEC) == -1)
{
@@ -2557,6 +2577,7 @@ keep_going: /* We will come back to here until there is
goto keep_going;
}
#endif /* F_SETFD */
+#endif
if (addr_cur->ai_family != AF_UNIX)
{
--
2.39.1