qemu-ga patch queue for hard-freeze

* fix leak in qga main loop error path
 * better error reporting when Windows version doesn't support fstrim
 -----BEGIN PGP SIGNATURE-----
 
 iQFOBAABCgA4FiEEzqzJ4VU066u4LT+gM1PJzvEItYQFAltWa6UaHG1kcm90aEBs
 aW51eC52bmV0LmlibS5jb20ACgkQM1PJzvEItYSNFgf8DfDrGDuWGITKFBBacLwx
 OwEF7O2hyYfBKXDe7aYrWDEMiETtqzOTcKigwbNt52uEKBMA0teRXwUrO1g7b7/X
 wGhmgFwBHri8VX3TK6ObWGtLWFkXDZ5QJTnCM4Ml2MjYDz2nwiAlmaIxxo7logf5
 ITZ+NCqyG6jazyFdYXVOuimk5KI+e8yZm0vEDuARKluCaKrAd9Zc0IkDWeqwxkPH
 bAcqPBsg7ZFF6cHyNC/HAlkQe/Sj6vAyOddAHDM5AI/Gmc09h8NCioKzBhWDJFU5
 yg6sTqAONV3huZi/SqvfVBppr4+ZoWOMw/83eVF6efpS5/+9L0XRWYVP7Sgq8deG
 TQ==
 =e+ml
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/mdroth/tags/qga-pull-2018-07-23-tag' into staging

qemu-ga patch queue for hard-freeze

* fix leak in qga main loop error path
* better error reporting when Windows version doesn't support fstrim

# gpg: Signature made Tue 24 Jul 2018 00:58:29 BST
# gpg:                using RSA key 3353C9CEF108B584
# gpg: Good signature from "Michael Roth <flukshun@gmail.com>"
# gpg:                 aka "Michael Roth <mdroth@utexas.edu>"
# gpg:                 aka "Michael Roth <mdroth@linux.vnet.ibm.com>"
# Primary key fingerprint: CEAC C9E1 5534 EBAB B82D  3FA0 3353 C9CE F108 B584

* remotes/mdroth/tags/qga-pull-2018-07-23-tag:
  qga: process_event() simplification and leak fix
  qga-win: Handle fstrim for OSes lower than Win8

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2018-07-24 12:40:11 +01:00
commit aabbca4105
2 changed files with 40 additions and 27 deletions

View File

@ -865,6 +865,19 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
GuestFilesystemTrimResponse *resp; GuestFilesystemTrimResponse *resp;
HANDLE handle; HANDLE handle;
WCHAR guid[MAX_PATH] = L""; WCHAR guid[MAX_PATH] = L"";
OSVERSIONINFO osvi;
BOOL win8_or_later;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
win8_or_later = (osvi.dwMajorVersion > 6 ||
((osvi.dwMajorVersion == 6) &&
(osvi.dwMinorVersion >= 2)));
if (!win8_or_later) {
error_setg(errp, "fstrim is only supported for Win8+");
return NULL;
}
handle = FindFirstVolumeW(guid, ARRAYSIZE(guid)); handle = FindFirstVolumeW(guid, ARRAYSIZE(guid));
if (handle == INVALID_HANDLE_VALUE) { if (handle == INVALID_HANDLE_VALUE) {

View File

@ -600,42 +600,42 @@ static void process_command(GAState *s, QDict *req)
static void process_event(JSONMessageParser *parser, GQueue *tokens) static void process_event(JSONMessageParser *parser, GQueue *tokens)
{ {
GAState *s = container_of(parser, GAState, parser); GAState *s = container_of(parser, GAState, parser);
QDict *qdict; QObject *obj;
QDict *req, *rsp;
Error *err = NULL; Error *err = NULL;
int ret; int ret;
g_assert(s && parser); g_assert(s && parser);
g_debug("process_event: called"); g_debug("process_event: called");
qdict = qobject_to(QDict, json_parser_parse_err(tokens, NULL, &err)); obj = json_parser_parse_err(tokens, NULL, &err);
if (err || !qdict) { if (err) {
qobject_unref(qdict); goto err;
if (!err) { }
g_warning("failed to parse event: unknown error"); req = qobject_to(QDict, obj);
error_setg(&err, QERR_JSON_PARSING); if (!req) {
} else { error_setg(&err, QERR_JSON_PARSING);
g_warning("failed to parse event: %s", error_get_pretty(err)); goto err;
} }
qdict = qmp_error_response(err); if (!qdict_haskey(req, "execute")) {
g_warning("unrecognized payload format");
error_setg(&err, QERR_UNSUPPORTED);
goto err;
} }
/* handle host->guest commands */ process_command(s, req);
if (qdict_haskey(qdict, "execute")) { qobject_unref(obj);
process_command(s, qdict); return;
} else {
if (!qdict_haskey(qdict, "error")) {
qobject_unref(qdict);
g_warning("unrecognized payload format");
error_setg(&err, QERR_UNSUPPORTED);
qdict = qmp_error_response(err);
}
ret = send_response(s, qdict);
if (ret < 0) {
g_warning("error sending error response: %s", strerror(-ret));
}
}
qobject_unref(qdict); err:
g_warning("failed to parse event: %s", error_get_pretty(err));
rsp = qmp_error_response(err);
ret = send_response(s, rsp);
if (ret < 0) {
g_warning("error sending error response: %s", strerror(-ret));
}
qobject_unref(rsp);
qobject_unref(obj);
} }
/* false return signals GAChannel to close the current client connection */ /* false return signals GAChannel to close the current client connection */