tools/libxs: Fix CLOEXEC handling in get_socket()

get_socket() opens a socket, then uses fcntl() to set CLOEXEC.  This is racy
with exec().

Open the socket with SOCK_CLOEXEC.  Use the same compatibility strategy as
O_CLOEXEC on ancient versions of Linux.

Reported-by: Frediano Ziglio <frediano.ziglio@cloud.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Acked-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
Andrew Cooper committed 2024-07-02 10:51:11 +01:00
1 parent bf7c146470
commit 1957dd6aff
1 file changed
+8 -6
+8 -6
View File
@@ -44,6 +44,10 @@
#define O_CLOEXEC 0
#endif
#ifndef SOCK_CLOEXEC
#define SOCK_CLOEXEC 0
#endif
struct xs_stored_msg {
XEN_TAILQ_ENTRY(struct xs_stored_msg) list;
struct xsd_sockmsg hdr;
@@ -207,16 +211,14 @@ int xs_fileno(struct xs_handle *h)
static int get_socket(const char *connect_to)
{
struct sockaddr_un addr;
int sock, saved_errno, flags;
int sock, saved_errno;
sock = socket(PF_UNIX, SOCK_STREAM, 0);
sock = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
if (sock < 0)
return -1;
if ((flags = fcntl(sock, F_GETFD)) < 0)
goto error;
flags |= FD_CLOEXEC;
if (fcntl(sock, F_SETFD, flags) < 0)
/* Compat for non-SOCK_CLOEXEC environments. Racy. */
if (!SOCK_CLOEXEC && !set_cloexec(sock))
goto error;
addr.sun_family = AF_UNIX;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.