@@ -35,8 +35,14 @@
int osdep_xencall_open(xencall_handle *xcall)
{
- int flags, saved_errno;
- int fd = open(PRIVCMD_DEV, O_RDWR);
+ int saved_errno;
+ int fd = open(PRIVCMD_DEV, O_RDWR|O_CLOEXEC);
+
+ /*
+ * This file descriptor is opaque to the caller, thus we are
+ * polite and try and ensure it doesn't propagate (ie leak)
+ * outside the process, by using O_CLOEXEC.
+ */
if ( fd == -1 )
{
@@ -45,26 +51,6 @@ int osdep_xencall_open(xencall_handle *xcall)
return -1;
}
- /*
- * Although we return the file handle as the 'xc handle' the API
- * does not specify / guarentee that this integer is in fact
- * a file handle. Thus we must take responsiblity to ensure
- * it doesn't propagate (ie leak) outside the process.
- */
- if ( (flags = fcntl(fd, F_GETFD)) < 0 )
- {
- PERROR("Could not get file handle flags");
- goto error;
- }
-
- flags |= FD_CLOEXEC;
-
- if ( fcntl(fd, F_SETFD, flags) < 0 )
- {
- PERROR("Could not set file handle flags");
- goto error;
- }
-
xcall->fd = fd;
return 0;
@@ -26,15 +26,23 @@
#include "private.h"
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
int osdep_xencall_open(xencall_handle *xcall)
{
- int flags, saved_errno;
- int fd = open("/dev/xen/privcmd", O_RDWR); /* prefer this newer interface */
+ int fd;
+
+ /*
+ * Prefer the newer interface.
+ */
+ fd = open("/dev/xen/privcmd", O_RDWR|O_CLOEXEC);
if ( fd == -1 && ( errno == ENOENT || errno == ENXIO || errno == ENODEV ))
{
/* Fallback to /proc/xen/privcmd */
- fd = open("/proc/xen/privcmd", O_RDWR);
+ fd = open("/proc/xen/privcmd", O_RDWR|O_CLOEXEC);
}
if ( fd == -1 )
@@ -43,32 +51,8 @@ int osdep_xencall_open(xencall_handle *xcall)
return -1;
}
- /* Although we return the file handle as the 'xc handle' the API
- does not specify / guarentee that this integer is in fact
- a file handle. Thus we must take responsiblity to ensure
- it doesn't propagate (ie leak) outside the process */
- if ( (flags = fcntl(fd, F_GETFD)) < 0 )
- {
- PERROR("Could not get file handle flags");
- goto error;
- }
-
- flags |= FD_CLOEXEC;
-
- if ( fcntl(fd, F_SETFD, flags) < 0 )
- {
- PERROR("Could not set file handle flags");
- goto error;
- }
-
xcall->fd = fd;
return 0;
-
- error:
- saved_errno = errno;
- close(fd);
- errno = saved_errno;
- return -1;
}
int osdep_xencall_close(xencall_handle *xcall)
@@ -32,7 +32,7 @@
int osdep_evtchn_open(xenevtchn_handle *xce)
{
- int fd = open(EVTCHN_DEV, O_RDWR);
+ int fd = open(EVTCHN_DEV, O_RDWR|O_CLOEXEC);
if ( fd == -1 )
return -1;
xce->fd = fd;
@@ -28,9 +28,13 @@
#include "private.h"
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
int osdep_evtchn_open(xenevtchn_handle *xce)
{
- int fd = open("/dev/xen/evtchn", O_RDWR);
+ int fd = open("/dev/xen/evtchn", O_RDWR|O_CLOEXEC);
if ( fd == -1 )
return -1;
xce->fd = fd;
@@ -33,8 +33,8 @@
int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem)
{
- int flags, saved_errno;
- int fd = open(PRIVCMD_DEV, O_RDWR);
+ int saved_errno;
+ int fd = open(PRIVCMD_DEV, O_RDWR|O_CLOEXEC);
if ( fd == -1 )
{
@@ -43,26 +43,6 @@ int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem)
return -1;
}
- /*
- * Although we return the file handle as the 'xc handle' the API
- * does not specify / guarentee that this integer is in fact
- * a file handle. Thus we must take responsiblity to ensure
- * it doesn't propagate (ie leak) outside the process.
- */
- if ( (flags = fcntl(fd, F_GETFD)) < 0 )
- {
- PERROR("Could not get file handle flags");
- goto error;
- }
-
- flags |= FD_CLOEXEC;
-
- if ( fcntl(fd, F_SETFD, flags) < 0 )
- {
- PERROR("Could not set file handle flags");
- goto error;
- }
-
fmem->fd = fd;
return 0;
@@ -30,15 +30,21 @@
#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1))
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem)
{
- int flags, saved_errno;
- int fd = open("/dev/xen/privcmd", O_RDWR); /* prefer this newer interface */
+ int fd;
+
+ /* prefer this newer interface */
+ fd = open("/dev/xen/privcmd", O_RDWR|O_CLOEXEC);
if ( fd == -1 && ( errno == ENOENT || errno == ENXIO || errno == ENODEV ))
{
/* Fallback to /proc/xen/privcmd */
- fd = open("/proc/xen/privcmd", O_RDWR);
+ fd = open("/proc/xen/privcmd", O_RDWR|O_CLOEXEC);
}
if ( fd == -1 )
@@ -47,32 +53,8 @@ int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem)
return -1;
}
- /* Although we return the file handle as the 'xc handle' the API
- does not specify / guarentee that this integer is in fact
- a file handle. Thus we must take responsiblity to ensure
- it doesn't propagate (ie leak) outside the process */
- if ( (flags = fcntl(fd, F_GETFD)) < 0 )
- {
- PERROR("Could not get file handle flags");
- goto error;
- }
-
- flags |= FD_CLOEXEC;
-
- if ( fcntl(fd, F_SETFD, flags) < 0 )
- {
- PERROR("Could not set file handle flags");
- goto error;
- }
-
fmem->fd = fd;
return 0;
-
- error:
- saved_errno = errno;
- close(fd);
- errno = saved_errno;
- return -1;
}
int osdep_xenforeignmemory_close(xenforeignmemory_handle *fmem)
@@ -43,9 +43,13 @@
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
int osdep_gnttab_open(xengnttab_handle *xgt)
{
- int fd = open(DEVXEN "gntdev", O_RDWR);
+ int fd = open(DEVXEN "gntdev", O_RDWR|O_CLOEXEC);
if ( fd == -1 )
return -1;
xgt->fd = fd;