[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH XEN v6 29/32] tools/libs/call: Use O_CLOEXEC when opening /dev/xen/privcmd on Linux
We stick with using FD_CLOEXEC on the legacy /proc/xen/privcmd fallback device since it was present in older kernel where O_CLOEXEC may not be assured. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v6: New --- tools/libs/call/linux.c | 57 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/tools/libs/call/linux.c b/tools/libs/call/linux.c index 3641e41..1485424 100644 --- a/tools/libs/call/linux.c +++ b/tools/libs/call/linux.c @@ -26,39 +26,56 @@ #include "private.h" -int osdep_xencall_open(xencall_handle *xcall) +static int set_cloexec(int fd) { - int flags, saved_errno; - int fd = open("/dev/xen/privcmd", O_RDWR); /* prefer this newer interface */ + int flags; - if ( fd == -1 && ( errno == ENOENT || errno == ENXIO || errno == ENODEV )) + if ( (flags = fcntl(fd, F_GETFD)) < 0 ) { - /* Fallback to /proc/xen/privcmd */ - fd = open("/proc/xen/privcmd", O_RDWR); + PERROR("Could not get file handle flags"); + return -1; } - if ( fd == -1 ) + flags |= FD_CLOEXEC; + + if ( fcntl(fd, F_SETFD, flags) < 0 ) { - PERROR("Could not obtain handle on privileged command interface"); + PERROR("Could not set file handle flags"); 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 ) + return 0; +} + +int osdep_xencall_open(xencall_handle *xcall) +{ + int saved_errno; + int fd; + + /* + * This file descriptor is opaque to the caller, thus we must take + * responsibility to ensure it doesn't propagate (ie leak) outside + * the process, by using CLOEXEC. + */ + + /* + * Prefer the newer interface. This was added in 3.14 which certainly had + * O_CLOEXEC. + */ + fd = open("/dev/xen/privcmd", O_RDWR|O_CLOEXEC); + + if ( fd == -1 && ( errno == ENOENT || errno == ENXIO || errno == ENODEV )) { - PERROR("Could not get file handle flags"); - goto error; + /* Fallback to /proc/xen/privcmd */ + fd = open("/proc/xen/privcmd", O_RDWR); + if ( fd > -1 && set_cloexec(fd) < 0 ) + goto error; } - flags |= FD_CLOEXEC; - - if ( fcntl(fd, F_SETFD, flags) < 0 ) + if ( fd == -1 ) { - PERROR("Could not set file handle flags"); - goto error; + PERROR("Could not obtain handle on privileged command interface"); + return -1; } xcall->fd = fd; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |