
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 :|