On Tue, Sep 23, 2008 at 04:56:08PM -0400, Cole Robinson wrote: > @@ -1670,7 +1670,7 @@ qemudMonitorCommand (const struct qemud_driver *driver ATTRIBUTE_UNUSED, > const char *cmd, > char **reply) { > int size = 0; > - char *buf = NULL; > + char *buf = NULL, *tmpbuf = NULL, *nlptr = NULL, *commptr = NULL; > size_t cmdlen = strlen(cmd); > > if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen) > @@ -1708,7 +1708,31 @@ qemudMonitorCommand (const struct qemud_driver *driver ATTRIBUTE_UNUSED, > > /* Look for QEMU prompt to indicate completion */ > if (buf && ((tmp = strstr(buf, "\n(qemu) ")) != NULL)) { > - tmp[0] = '\0'; > + /* Preserve the newline */ > + tmp[1] = '\0'; > + > + /* The monitor doesn't dump clean output after we have written to > + * it. Every character we write dumps a bunch of useless stuff, > + * so the result looks like "cXcoXcomXcommXcommaXcommanXcommand" > + * Try to throw away everything before the first full command > + * occurence, and inbetween the command and the newline starting > + * the response > + */ > + if ((commptr = strstr(buf, cmd))) { > + tmpbuf = buf; > + buf = NULL; > + if ((nlptr = strchr(commptr, '\n'))) { > + if (VIR_ALLOC_N(buf, strlen(cmd) + strlen(nlptr) + 1) < 0) > + goto error; > + strncpy(buf, cmd, strlen(cmd)); > + strcat(buf, nlptr); > + } else { > + if ((buf = strdup(commptr)) == NULL) > + goto error; > + } > + VIR_FREE(tmpbuf); > + } It looks to me like tmpbuf is leaked on the two error paths. garbage.collection++ Rich. -- Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list