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

[xen master] libxl: don't leak self pipes



commit 7fbebfa5406dadd82ba2e650282715dacf771133
Author:     Jason Andryuk <jandryuk@xxxxxxxxx>
AuthorDate: Wed Jun 1 09:18:49 2022 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jun 1 09:18:49 2022 +0200

    libxl: don't leak self pipes
    
    libxl is leaking self pipes to child processes.  These can be seen when
    running with env var _LIBXL_DEBUG_EXEC_FDS=1:
    
    libxl: debug: libxl_aoutils.c:593:libxl__async_exec_start: forking to 
execute: /etc/xen/scripts/vif-bridge online
    [Detaching after fork from child process 5099]
    libxl: execing /etc/xen/scripts/vif-bridge: fd 4 is open to pipe:[46805] 
with flags 0
    libxl: execing /etc/xen/scripts/vif-bridge: fd 13 is open to pipe:[46807] 
with flags 0
    libxl: execing /etc/xen/scripts/vif-bridge: fd 14 is open to pipe:[46807] 
with flags 0
    libxl: execing /etc/xen/scripts/vif-bridge: fd 19 is open to pipe:[48570] 
with flags 0
    libxl: execing /etc/xen/scripts/vif-bridge: fd 20 is open to pipe:[48570] 
with flags 0
    
    (fd 3 is also open, but the check only starts at 4 for some reason.)
    
    For xl, this is the poller created by libxl_ctx_alloc, the poller
    created by do_domain_create -> libxl__ao_create, and the self pipe for
    libxl__sigchld_needed.  Set CLOEXEC on the FDs so they are not leaked
    into children.
    
    Signed-off-by: Jason Andryuk <jandryuk@xxxxxxxxx>
    Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 tools/libs/light/libxl_event.c | 3 +++
 tools/libs/light/libxl_fork.c  | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/tools/libs/light/libxl_event.c b/tools/libs/light/libxl_event.c
index c8bcd13960..8d24613921 100644
--- a/tools/libs/light/libxl_event.c
+++ b/tools/libs/light/libxl_event.c
@@ -1800,6 +1800,9 @@ int libxl__poller_init(libxl__gc *gc, libxl__poller *p)
     rc = libxl__pipe_nonblock(CTX, p->wakeup_pipe);
     if (rc) goto out;
 
+    libxl_fd_set_cloexec(CTX, p->wakeup_pipe[0], 1);
+    libxl_fd_set_cloexec(CTX, p->wakeup_pipe[1], 1);
+
     return 0;
 
  out:
diff --git a/tools/libs/light/libxl_fork.c b/tools/libs/light/libxl_fork.c
index 676a14bb28..b13659d231 100644
--- a/tools/libs/light/libxl_fork.c
+++ b/tools/libs/light/libxl_fork.c
@@ -387,6 +387,8 @@ int libxl__sigchld_needed(libxl__gc *gc) /* non-reentrant, 
idempotent */
     if (CTX->sigchld_selfpipe[0] < 0) {
         rc = libxl__pipe_nonblock(CTX, CTX->sigchld_selfpipe);
         if (rc) goto out;
+        libxl_fd_set_cloexec(CTX, CTX->sigchld_selfpipe[0], 1);
+        libxl_fd_set_cloexec(CTX, CTX->sigchld_selfpipe[1], 1);
     }
     if (!libxl__ev_fd_isregistered(&CTX->sigchld_selfpipe_efd)) {
         rc = libxl__ev_fd_register(gc, &CTX->sigchld_selfpipe_efd,
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

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