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
signature.asc
Description: OpenPGP digital signature