[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen stable-4.17] tools/libxs: Fix CLOEXEC handling in xs_fileno()



commit 750475017de246846a707470ebc88374f9bc9dc9
Author:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Thu Jul 4 14:22:15 2024 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Jul 4 14:22:15 2024 +0200

    tools/libxs: Fix CLOEXEC handling in xs_fileno()
    
    xs_fileno() opens a pipe on first use to communicate between the watch 
thread
    and the main thread.  Nothing ever sets CLOEXEC on the file descriptors.
    
    Check for the availability of the pipe2() function with configure.  Despite
    starting life as Linux-only, FreeBSD and NetBSD have gained it.
    
    When pipe2() isn't available, try our best with pipe() and set_cloexec().
    
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Reviewed-by: Juergen Gross <jgross@xxxxxxxx>
    Acked-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
    master commit: a2ff677852f0ce05fa335e8e5682bf2ae0c916ee
    master date: 2024-07-02 10:52:59 +0100
---
 tools/config.h.in     |  3 +++
 tools/configure       | 12 ++++++++++++
 tools/configure.ac    |  2 ++
 tools/libs/store/xs.c | 16 +++++++++++++++-
 4 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/tools/config.h.in b/tools/config.h.in
index 3071cb3998..9d839f8af1 100644
--- a/tools/config.h.in
+++ b/tools/config.h.in
@@ -39,6 +39,9 @@
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
+/* Define to 1 if you have the `pipe2' function. */
+#undef HAVE_PIPE2
+
 /* Qemu traditional enabled */
 #undef HAVE_QEMU_TRADITIONAL
 
diff --git a/tools/configure b/tools/configure
index 6f0b0bb82b..402364f4c4 100755
--- a/tools/configure
+++ b/tools/configure
@@ -9699,6 +9699,18 @@ if test "$ax_found" = "0"; then :
 fi
 
 
+for ac_func in pipe2
+do :
+  ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
+if test "x$ac_cv_func_pipe2" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PIPE2 1
+_ACEOF
+
+fi
+done
+
+
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
diff --git a/tools/configure.ac b/tools/configure.ac
index 31bdef3d70..c1ea1e32ca 100644
--- a/tools/configure.ac
+++ b/tools/configure.ac
@@ -518,4 +518,6 @@ AS_IF([test "x$pvshim" = "xy"], [
 
 AX_FIND_HEADER([INCLUDE_ENDIAN_H], [endian.h sys/endian.h])
 
+AC_CHECK_FUNCS([pipe2])
+
 AC_OUTPUT()
diff --git a/tools/libs/store/xs.c b/tools/libs/store/xs.c
index 26542f13dd..3f723bff5a 100644
--- a/tools/libs/store/xs.c
+++ b/tools/libs/store/xs.c
@@ -190,13 +190,27 @@ static bool set_cloexec(int fd)
        return fcntl(fd, flags | FD_CLOEXEC) >= 0;
 }
 
+static int pipe_cloexec(int fds[2])
+{
+#if HAVE_PIPE2
+       return pipe2(fds, O_CLOEXEC);
+#else
+       if (pipe(fds) < 0)
+               return -1;
+       /* Best effort to set CLOEXEC.  Racy. */
+       set_cloexec(fds[0]);
+       set_cloexec(fds[1]);
+       return 0;
+#endif
+}
+
 int xs_fileno(struct xs_handle *h)
 {
        char c = 0;
 
        mutex_lock(&h->watch_mutex);
 
-       if ((h->watch_pipe[0] == -1) && (pipe(h->watch_pipe) != -1)) {
+       if ((h->watch_pipe[0] == -1) && (pipe_cloexec(h->watch_pipe) != -1)) {
                /* Kick things off if the watch list is already non-empty. */
                if (!list_empty(&h->watch_list))
                        while (write(h->watch_pipe[1], &c, 1) != 1)
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.17



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.