[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 01/24] qga: Support Unicode paths in guest-file-op
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PULL v3 01/24] qga: Support Unicode paths in guest-file-open on win32 |
Date: |
Wed, 31 Oct 2018 09:19:02 -0500 |
From: Jonathon Reinhart <address@hidden>
Currently, the win32 port of QEMU Guest Agent does not properly handle Unicode
paths. The JSON decoder produces a valid UTF-8 path string, but this is passed
directly to CreateFileA, which is expecting an ANSI string and not UTF-8. This
leads to mangled filenames.
This patch follows the example of qmp_guest_set_user_password() and uses
g_utf8_to_utf16() to convert the string to UTF-16 and calls CreateFileW()
explicitly.
Signed-off-by: Jonathon Reinhart <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
---
qga/commands-win32.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 98d9735389..416343b97b 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -160,13 +160,15 @@ static void handle_set_nonblocking(HANDLE fh)
int64_t qmp_guest_file_open(const char *path, bool has_mode,
const char *mode, Error **errp)
{
- int64_t fd;
+ int64_t fd = -1;
HANDLE fh;
HANDLE templ_file = NULL;
DWORD share_mode = FILE_SHARE_READ;
DWORD flags_and_attr = FILE_ATTRIBUTE_NORMAL;
LPSECURITY_ATTRIBUTES sa_attr = NULL;
OpenFlags *guest_flags;
+ GError *gerr = NULL;
+ wchar_t *w_path = NULL;
if (!has_mode) {
mode = "r";
@@ -175,16 +177,21 @@ int64_t qmp_guest_file_open(const char *path, bool
has_mode,
guest_flags = find_open_flag(mode);
if (guest_flags == NULL) {
error_setg(errp, "invalid file open mode");
- return -1;
+ goto done;
+ }
+
+ w_path = g_utf8_to_utf16(path, -1, NULL, NULL, &gerr);
+ if (!w_path) {
+ goto done;
}
- fh = CreateFile(path, guest_flags->desired_access, share_mode, sa_attr,
+ fh = CreateFileW(w_path, guest_flags->desired_access, share_mode, sa_attr,
guest_flags->creation_disposition, flags_and_attr,
templ_file);
if (fh == INVALID_HANDLE_VALUE) {
error_setg_win32(errp, GetLastError(), "failed to open file '%s'",
path);
- return -1;
+ goto done;
}
/* set fd non-blocking to avoid common use cases (like reading from a
@@ -196,10 +203,17 @@ int64_t qmp_guest_file_open(const char *path, bool
has_mode,
if (fd < 0) {
CloseHandle(fh);
error_setg(errp, "failed to add handle to qmp handle table");
- return -1;
+ goto done;
}
slog("guest-file-open, handle: % " PRId64, fd);
+
+done:
+ if (gerr) {
+ error_setg(errp, QERR_QGA_COMMAND_FAILED, gerr->message);
+ g_error_free(gerr);
+ }
+ g_free(w_path);
return fd;
}
--
2.17.1
- [Qemu-devel] [PULL v3 13/24] qga-win: refactor disk info, (continued)
- [Qemu-devel] [PULL v3 13/24] qga-win: refactor disk info, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 16/24] qga-win: demystify namespace stripping, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 18/24] qga: group agent init/cleanup init separate routines, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 12/24] qga-win: report disk serial number, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 14/24] qga-win: handle multi-disk volumes, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 20/24] qga: move w32 service handling out of run_agent(), Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 09/24] build: rename CONFIG_QGA_NTDDDISK to CONFIG_QGA_NTDDSCSI, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 19/24] qga: hang GAConfig/socket_activation off of GAState global, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 17/24] qga: fix an off-by-one issue, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 10/24] qga-win: add debugging information, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 01/24] qga: Support Unicode paths in guest-file-open on win32,
Michael Roth <=
- [Qemu-devel] [PULL v3 21/24] qga: add --retry-path option for re-initializing channel on failure, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 22/24] qga-win: install service with --retry-path set by default, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 24/24] qga-win: changing --retry-path option behavior, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 23/24] qga-win: report specific error when failing to open channel, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 02/24] qga-win: add support for qmp_guest_fsfreeze_freeze_list, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 03/24] qga: ignore non present cpus when handling qmp_guest_get_vcpus(), Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 08/24] qga-win: fsinfo: pci-info: allow partial info, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 07/24] qga-win: prevent crash when executing fsinfo command, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 04/24] configure: add test for libudev, Michael Roth, 2018/10/31
- [Qemu-devel] [PULL v3 05/24] qga: linux: report disk serial number, Michael Roth, 2018/10/31