On 12/31/2014 06:06 AM, Denis V. Lunev wrote:
> From: Simon Zolin <szo...@parallels.com>
> 
> Moved the code that sets non-blocking flag on fd into a separate function.
> 
> Signed-off-by: Simon Zolin <szo...@parallels.com>
> Acked-by: Roman Kagan <rka...@parallels.com>
> Signed-off-by: Denis V. Lunev <d...@openvz.org>
> CC: Michael Roth <mdr...@linux.vnet.ibm.com>
> ---
>  qga/commands-posix.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index f6f3e3c..fd746db 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -376,13 +376,33 @@ safe_open_or_create(const char *path, const char *mode, 
> Error **errp)
>      return NULL;
>  }
>  
> +static int guest_file_toggle_flags(int fd, long flags, bool set, Error **err)
> +{

Why is 'flags' a long?

> +    int ret, old_flags;
> +
> +    old_flags = fcntl(fd, F_GETFL);
> +    if (old_flags == -1) {
> +        error_set_errno(err, errno, QERR_QGA_COMMAND_FAILED,
> +                        "failed to fetch filehandle flags");
> +        return -1;
> +    }
> +
> +    ret = fcntl(fd, F_SETFL, set ? (old_flags | flags) : (old_flags & 
> ~flags));

Bug. 'int | long' is a long, but on 64-bit platforms, passing a 'long'
as the var-arg third argument of fcntl where the interface expects 'int'
is liable to corrupt things depending on endianness.  You MUST pass an
'int' for F_SETFL.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to