qemu: monitor: Fix type of holdtime argument in qemuMonitorJSONSendKey

qemuMonitorJSONSendKey declares the "holdtime" argument as unsigned int
while the command was constructed in qemuMonitorJSONMakeCommand using
the "P" modifier which took a unsigned long from the variable
arguments which then made it possible to access uninitialized memory.

This broke the qemumonitorjsontest on 32bit fedora 20:
64) qemuMonitorJSONSendKey
... libvirt: QEMU Driver error : internal error: unsupported data type 'W' for arg 'WVSƒì ‹D$0è‘wÿÿÃAå' FAILED

Uncovered by upstream commit f744b831c6.

Additionally add test for the hold-time option.
This commit is contained in:
Peter Krempa 2014-06-03 11:19:51 +02:00
parent 10a99a6d13
commit ce2107a9a0
2 changed files with 34 additions and 1 deletions

View File

@ -3610,7 +3610,7 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
cmd = qemuMonitorJSONMakeCommand("send-key",
"a:keys", keys,
"P:hold-time", holdtime,
"p:hold-time", holdtime,
NULL);
if (!cmd)
goto cleanup;

View File

@ -1959,6 +1959,38 @@ testQemuMonitorJSONqemuMonitorJSONSendKey(const void *data)
return ret;
}
static int
testQemuMonitorJSONqemuMonitorJSONSendKeyHoldtime(const void *data)
{
virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, xmlopt);
int ret = -1;
unsigned int keycodes[] = {43, 26, 46, 32};
if (!test)
return -1;
if (qemuMonitorTestAddItemParams(test, "send-key",
"{\"return\":{}}",
"hold-time", "31337",
"keys", "[{\"type\":\"number\",\"data\":43},"
"{\"type\":\"number\",\"data\":26},"
"{\"type\":\"number\",\"data\":46},"
"{\"type\":\"number\",\"data\":32}]",
NULL, NULL) < 0)
goto cleanup;
if (qemuMonitorJSONSendKey(qemuMonitorTestGetMonitor(test),
31337, keycodes,
ARRAY_CARDINALITY(keycodes)) < 0)
goto cleanup;
ret = 0;
cleanup:
qemuMonitorTestFree(test);
return ret;
}
static int
testQemuMonitorJSONqemuMonitorJSONGetDumpGuestMemoryCapability(const void *data)
{
@ -2230,6 +2262,7 @@ mymain(void)
DO_TEST(qemuMonitorJSONGetVirtType);
DO_TEST(qemuMonitorJSONSendKey);
DO_TEST(qemuMonitorJSONGetDumpGuestMemoryCapability);
DO_TEST(qemuMonitorJSONSendKeyHoldtime);
DO_TEST_CPU_DATA("host");
DO_TEST_CPU_DATA("full");