[libvirt] [PATCH] Sanitize qemu monitor output
Daniel P. Berrange
berrange at redhat.com
Thu Dec 11 19:30:38 UTC 2008
On Thu, Dec 11, 2008 at 10:13:05AM -0500, Cole Robinson wrote:
> Cole Robinson wrote:
> Just want to bump this. I'd like to commit this if there are no
> objections.
Opps, I thought you already had comitted it !
ACK from me.
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index 0130d61..0c4226c 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -1145,7 +1145,23 @@ 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';
> + char *commptr = NULL, *nlptr = NULL;
> +
> + /* 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)))
> + memmove(buf, commptr, strlen(commptr)+1);
> + if ((nlptr = strchr(buf, '\n')))
> + memmove(buf+strlen(cmd), nlptr, strlen(nlptr)+1);
> +
> break;
> }
> pollagain:
> @@ -2596,7 +2612,7 @@ static int qemudDomainChangeEjectableMedia(virDomainPtr dom,
>
> if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
> qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
> - "%s", _("cannot change cdrom media"));
> + "%s", _("could not change cdrom media"));
> VIR_FREE(cmd);
> return -1;
> }
> @@ -2607,7 +2623,7 @@ static int qemudDomainChangeEjectableMedia(virDomainPtr dom,
> DEBUG ("ejectable media change reply: %s", reply);
> if (strstr(reply, "\ndevice ")) {
> qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
> - "%s", _("changing cdrom media failed"));
> + _("changing cdrom media failed: %s"), reply);
> VIR_FREE(reply);
> VIR_FREE(cmd);
> return -1;
> @@ -3143,7 +3159,7 @@ qemudDomainBlockStats (virDomainPtr dom,
> * unlikely to be the name of a block device, we can use this
> * to detect if qemu supports the command.
> */
> - if (STRPREFIX (info, "info ")) {
> + if (strstr(info, "\ninfo ")) {
> qemudReportError (dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
> "%s",
> _("'info blockstats' not supported by this qemu"));
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list