
On Tue, Dec 08, 2009 at 06:08:04PM +0000, Daniel P. Berrange wrote:
The QEMU 0.10.0 release (and possibly other 0.10.x) has a bug where it sometimes/often forgets to display the initial monitor greeting line, soley printing a (qemu). This in turn confuses the text console parsing because it has a '(qemu)' it is not expecting. The confusion results in a negative malloc. Bad things follow.
This re-writes the text console handling to be more robust. The key idea is that it should only look for a (qemu), once it has seen the original command echo'd back. This ensures it'll skip the bogus stray (qemu) with broken QEMUs.
* src/qemu/qemu_monitor.c: Add some (disabled) debug code * src/qemu/qemu_monitor_text.c: Re-write way command replies are detected --- src/qemu/qemu_monitor.c | 28 +++++++++++ src/qemu/qemu_monitor_text.c | 102 +++++++++++++++++++++++++++-------------- 2 files changed, 95 insertions(+), 35 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index abb763c..103cf28 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -39,6 +39,8 @@
#define VIR_FROM_THIS VIR_FROM_QEMU
+#define QEMU_DEBUG_RAW_IO 0 + struct _qemuMonitor { virMutex lock; virCond notify; @@ -163,6 +165,24 @@ char *qemuMonitorEscapeShell(const char *in) }
+#if QEMU_DEBUG_RAW_IO +#include <c-ctype.h> +static char * qemuMonitorEscapeNonPrintable(const char *text) +{ + int i; + virBuffer buf = VIR_BUFFER_INITIALIZER; + for (i = 0 ; text[i] != '\0' ; i++) { + if (c_isprint(text[i]) ||
Hum I just hope c_isprint behaviour doesn't depend on the user locale, otherwise I would just replace it with an explicit value test on the ASCII range, not a big deal since it's just for debug though ...
+ text[i] == '\n' || + (text[i] == '\r' && text[i+1] == '\n')) + virBufferVSprintf(&buf,"%c", text[i]); + else + virBufferVSprintf(&buf, "0x%02x", text[i]); + } + return virBufferContentAndReset(&buf); +} +#endif
ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/