mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
bf7c146470
commit
1957dd6aff
1 file changed
+8
-6
@@ -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;
|
||||
|
||||