[Libguestfs] [PATCH] daemon: Set O_CLOEXEC flag on the virtio-serial port.

Richard W.M. Jones rjones at redhat.com
Fri Aug 27 14:28:11 UTC 2010


You can see that currently we leak the virtio-serial file
descriptor into child processes.

><fs> debug fds ''
 0 /dev/console
 1 /dev/console
 2 /dev/console
 3 /dev/vport0p1
 4 /proc/252/fd

><fs> debug sh 'ls -l /proc/self/fd'
total 0
lr-x------ 1 root root 64 Aug 27 15:14 0 -> /dev/null
l-wx------ 1 root root 64 Aug 27 15:14 1 -> pipe:[5124]
l-wx------ 1 root root 64 Aug 27 15:14 2 -> pipe:[5124]
lrwx------ 1 root root 64 Aug 27 15:14 3 -> /dev/vport0p1
lr-x------ 1 root root 64 Aug 27 15:14 4 -> /proc/271/fd

The attached patch fixes this by setting close-on-exec.  I'm using
O_CLOEXEC which will only work with relatively recent versions of
Linux.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
-------------- next part --------------
>From 272a763c6125a8c7ad54aae5bb048f427df07868 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Fri, 27 Aug 2010 15:27:22 +0100
Subject: [PATCH] daemon: Set O_CLOEXEC flag on the virtio-serial port.

---
 daemon/guestfsd.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c
index 8130524..e398b7d 100644
--- a/daemon/guestfsd.c
+++ b/daemon/guestfsd.c
@@ -60,6 +60,11 @@ static char *read_cmdline (void);
 # define MAX(a,b) ((a)>(b)?(a):(b))
 #endif
 
+/* Not the end of the world if this open flag is not defined. */
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
 /* If root device is an ext2 filesystem, this is the major and minor.
  * This is so we can ignore this device from the point of view of the
  * user, eg. in guestfs_list_devices and many other places.
@@ -237,7 +242,8 @@ main (int argc, char *argv[])
 #endif
 
   /* Connect to virtio-serial channel. */
-  int sock = open ("/dev/virtio-ports/org.libguestfs.channel.0", O_RDWR);
+  int sock = open ("/dev/virtio-ports/org.libguestfs.channel.0",
+                   O_RDWR | O_CLOEXEC);
   if (sock == -1) {
     fprintf (stderr,
              "\n"
-- 
1.7.1



More information about the Libguestfs mailing list