[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/1] qga-win: fix "guest-get-fsinfo" wrong filesystem type
From: |
Basil Salman |
Subject: |
[PATCH 1/1] qga-win: fix "guest-get-fsinfo" wrong filesystem type |
Date: |
Thu, 30 Apr 2020 15:11:40 +0300 |
From: Basil Salman <address@hidden>
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 <address@hidden>
Signed-off-by: Basil Salman <address@hidden>
---
qga/commands-win32.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 82cf053..be07712 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -1021,11 +1021,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) {
@@ -1040,18 +1042,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 volume name");
+ 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;
@@ -1070,9 +1081,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;
}
--
1.8.3.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH 1/1] qga-win: fix "guest-get-fsinfo" wrong filesystem type,
Basil Salman <=