From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, Basil Salman <bsalman@redhat.com>,
Basil Salman <basil@daynix.com>
Subject: [PULL for-5.1 1/2] qga-win: fix "guest-get-fsinfo" wrong filesystem type
Date: Mon, 27 Jul 2020 18:22:36 -0500 [thread overview]
Message-ID: <20200727232237.31024-2-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <20200727232237.31024-1-mdroth@linux.vnet.ibm.com>
From: Basil Salman <bsalman@redhat.com>
This patch handles the case where unmounted volumes exist,
where in that case GetVolumePathNamesForVolumeName returns
empty path, GetVolumeInformation will use the current working
directory instead.
This patch fixes the issue by opening a handle to the volumes,
and using GetVolumeInformationByHandleW instead.
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1746667
Signed-off-by: Basil Salman <bsalman@redhat.com>
Signed-off-by: Basil Salman <basil@daynix.com>
*fix crash when guest_build_fsinfo() sets errp multiple times
*make new error message more distinct from existing ones
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
qga/commands-win32.c | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index aaa71f147b..15c9d7944b 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -958,11 +958,13 @@ static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
{
DWORD info_size;
char mnt, *mnt_point;
+ wchar_t wfs_name[32];
char fs_name[32];
- char vol_info[MAX_PATH+1];
+ wchar_t vol_info[MAX_PATH + 1];
size_t len;
uint64_t i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;
GuestFilesystemInfo *fs = NULL;
+ HANDLE hLocalDiskHandle = NULL;
GetVolumePathNamesForVolumeName(guid, (LPCH)&mnt, 0, &info_size);
if (GetLastError() != ERROR_MORE_DATA) {
@@ -977,18 +979,27 @@ static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
goto free;
}
+ hLocalDiskHandle = CreateFile(guid, 0 , 0, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL |
+ FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (INVALID_HANDLE_VALUE == hLocalDiskHandle) {
+ error_setg_win32(errp, GetLastError(), "failed to get handle for volume");
+ goto free;
+ }
+
len = strlen(mnt_point);
mnt_point[len] = '\\';
mnt_point[len+1] = 0;
- if (!GetVolumeInformation(mnt_point, vol_info, sizeof(vol_info), NULL, NULL,
- NULL, (LPSTR)&fs_name, sizeof(fs_name))) {
+
+ if (!GetVolumeInformationByHandleW(hLocalDiskHandle, vol_info,
+ sizeof(vol_info), NULL, NULL, NULL,
+ (LPWSTR) & wfs_name, sizeof(wfs_name))) {
if (GetLastError() != ERROR_NOT_READY) {
error_setg_win32(errp, GetLastError(), "failed to get volume info");
}
goto free;
}
- fs_name[sizeof(fs_name) - 1] = 0;
fs = g_malloc(sizeof(*fs));
fs->name = g_strdup(guid);
fs->has_total_bytes = false;
@@ -1007,9 +1018,11 @@ static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
fs->has_used_bytes = true;
}
}
+ wcstombs(fs_name, wfs_name, sizeof(wfs_name));
fs->type = g_strdup(fs_name);
fs->disk = build_guest_disk_info(guid, errp);
free:
+ CloseHandle(hLocalDiskHandle);
g_free(mnt_point);
return fs;
}
@@ -1027,8 +1040,12 @@ GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
}
do {
- GuestFilesystemInfo *info = build_guest_fsinfo(guid, errp);
- if (info == NULL) {
+ Error *local_err = NULL;
+ GuestFilesystemInfo *info = build_guest_fsinfo(guid, &local_err);
+ if (local_err) {
+ g_debug("failed to get filesystem info, ignoring error: %s",
+ error_get_pretty(local_err));
+ error_free(local_err);
continue;
}
new = g_malloc(sizeof(*ret));
--
2.17.1
next prev parent reply other threads:[~2020-07-27 23:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-27 23:22 [PULL for-5.1 0/2] qemu-ga patch queue for hard-freeze Michael Roth
2020-07-27 23:22 ` Michael Roth [this message]
2020-07-27 23:22 ` [PULL for-5.1 2/2] qga/qapi-schema: Document -1 for invalid PCI address fields Michael Roth
2020-07-28 15:27 ` [PULL for-5.1 0/2] qemu-ga patch queue for hard-freeze Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200727232237.31024-2-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=basil@daynix.com \
--cc=bsalman@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.