[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work wi
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets |
Date: |
Sat, 11 Aug 2012 08:28:56 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 |
On 08/11/2012 07:14 AM, Corey Bryant wrote:
> When qemu_open is passed a filename of the "/dev/fdset/nnn"
> format (where nnn is the fdset ID), an fd with matching access
> mode flags will be searched for within the specified monitor
> fd set. If the fd is found, a dup of the fd will be returned
> from qemu_open.
>
> v9:
> -Drop fdset refcount and check dup_fds instead. (address@hidden)
> -Fix dupfd leak in qemu_dup(). (address@hidden)
> -Always set O_CLOEXEC in qemu_dup(). (address@hidden)
> -Change name of qemu_dup() to qemu_dup_flags(). (address@hidden)
>
> @@ -87,6 +146,40 @@ int qemu_open(const char *name, int flags, ...)
> int ret;
> int mode = 0;
>
> +#ifndef _WIN32
> + const char *fdset_id_str;
> +
> + /* Attempt dup of fd from fd set */
> + if (strstart(name, "/dev/fdset/", &fdset_id_str)) {
> + int64_t fdset_id;
> + int fd, dupfd;
> +
> + fdset_id = qemu_parse_fdset(fdset_id_str);
> + if (fdset_id == -1) {
> + errno = EINVAL;
> + return -1;
> + }
> +
> + fd = monitor_fdset_get_fd(fdset_id, flags);
> + if (fd == -1) {
> + return -1;
> + }
> +
> + dupfd = qemu_dup_flags(fd, flags);
> + if (fd == -1) {
Checking the wrong condition:
s/fd/dupfd/
> + return -1;
> + }
> +
> + ret = monitor_fdset_dup_fd_add(fdset_id, dupfd);
> + if (ret == -1) {
> + close(dupfd);
> + return -1;
This function appears to promise a reasonable errno on failure.
However, I don't think monitor_fdset_dup_fd_add guarantees a reasonable
errno, and even if it does, close() can corrupt errno. I think that
prior to returning here, you either need an explicit errno=ENOMEM, or
fix monitor_fdset_dup_fd to guarantee a nice errno, plus a save and
restore of errno here. Unless no one cares about errno on failure, in
which case your earlier errno=EINVAL can be dropped.
--
Eric Blake address@hidden +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH v9 0/7] file descriptor passing using fd sets, Corey Bryant, 2012/08/11
- [Qemu-devel] [PATCH v9 2/7] qapi: Introduce add-fd, remove-fd, query-fdsets, Corey Bryant, 2012/08/11
- [Qemu-devel] [PATCH v9 4/7] block: Convert open calls to qemu_open, Corey Bryant, 2012/08/11
- [Qemu-devel] [PATCH v9 3/7] block: Prevent detection of /dev/fdset/ as floppy, Corey Bryant, 2012/08/11
- [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Corey Bryant, 2012/08/11
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets,
Eric Blake <=
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Corey Bryant, 2012/08/13
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Eric Blake, 2012/08/13
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Corey Bryant, 2012/08/13
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Eric Blake, 2012/08/13
- Re: [Qemu-devel] [PATCH v9 6/7] block: Enable qemu_open/close to work with fd sets, Corey Bryant, 2012/08/13
[Qemu-devel] [PATCH v9 5/7] block: Convert close calls to qemu_close, Corey Bryant, 2012/08/11
[Qemu-devel] [PATCH v9 7/7] monitor: Clean up fd sets on monitor disconnect, Corey Bryant, 2012/08/11
[Qemu-devel] [PATCH v9 1/7] qemu-char: Add MSG_CMSG_CLOEXEC flag to recvmsg, Corey Bryant, 2012/08/11