[libvirt] [PATCH V3] Add proxy FS support to libvirt

Daniel P. Berrange berrange at redhat.com
Wed Aug 8 15:28:06 UTC 2012


On Wed, Aug 08, 2012 at 03:03:51PM +0100, Daniel P. Berrange wrote:
> On Sun, Aug 05, 2012 at 10:04:35AM +0530, M. Mohan Kumar wrote:
> > @@ -2575,9 +2577,43 @@ error:
> >      return NULL;
> >  }
> >  
> > +/*
> > + * Invokes the Proxy Helper with one of the socketpair as its parameter
> > + *
> > + */
> > +static int qemuInvokeProxyHelper(const char *emulator, int sock, const char *path)
> > +{
> > +#define HELPER "virtfs-proxy-helper"
> > +    int ret_val, status;
> > +    virCommandPtr cmd;
> > +    char *helper, *dname;
> > +
> > +    dname = dirname(strdup(emulator));
> 
> Missing check for NULL from strdup()
> 
> > +    if (virAsprintf(&helper, "%s/%s", dname, HELPER) < 0) {
> > +        VIR_FREE(dname);
> > +        virReportOOMError();
> > +        return -1;
> 
> You must VIR_FORCE_CLOSE(sock) here, since other exit
> paths will close it
> 
> > +    }
> 
> I think this is slightly bogus - and it'd be  better to
> do  virFindFileInPath(HELPER), and if that doesn't work
> then also look in /usr/libexec/$HELPER.

Actually I take this back. You are doing what I originally
suggested you do, which is correct.  Looking in $PATH would
be wrong since it might find a proxy that's from a different
version of QEMU. We do need to take account of fact that
QEMU might be in $prefix/libexec, instead of $prefix/bin.

Also Unfortunately dirname is not thread-safe since it can
return a statically allocated string - which must not
be free()d, so we can't use that.

So I think I'd build the path slightly differently:

  char *tmp, *prefix;
  if (!(prefix = strdup(emulator))) {
     virReportOOMError();
     return -1;
  }
  if (tmp = strstr(prefix, "/bin/") ||
      tmp = strstr(prefix, "/libexec/") {
    *tmp = '\0';
  } else {
     virReportError(VIR_ERR_INTERNAL_ERROR,
                   _("Unable to determine prefix from %s"),
                    emulator);
     VIR_FREE(prefix);
  }
  if (virAsprintf(&path, "%s/bin/" HELPER, prefix) < 0) {
     VIR_FREE(prefix);
     return -1;
  }
  VIR_FREE(prefix);

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list