On Thu, Apr 23, 2015 at 08:23:18AM -0400, Frediano Ziglio wrote: > This allow username to contain any extended characters. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > vdagent/file_xfer.cpp | 32 +++++++++++++------------------- > vdagent/file_xfer.h | 9 +++++---- > 2 files changed, 18 insertions(+), 23 deletions(-) > > diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp > index 2dc138b..275768b 100644 > --- a/vdagent/file_xfer.cpp > +++ b/vdagent/file_xfer.cpp > @@ -39,7 +39,7 @@ FileXfer::~FileXfer() > for (iter = _tasks.begin(); iter != _tasks.end(); iter++) { > task = iter->second; > CloseHandle(task->handle); > - DeleteFileA(task->name); > + DeleteFile(task->name); > delete task; > } > } > @@ -48,7 +48,8 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, > VDAgentFileXferStatusMessage* status) > { > char* file_meta = (char*)start->data; > - char file_path[MAX_PATH], file_name[MAX_PATH]; > + TCHAR file_path[MAX_PATH]; > + char file_name[MAX_PATH]; > ULARGE_INTEGER free_bytes; > FileXferTask* task; > uint64_t file_size; > @@ -73,12 +74,12 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, > return; > } > > - if (FAILED(SHGetFolderPathA(NULL, CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE, NULL, > + if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE, NULL, > SHGFP_TYPE_CURRENT, file_path))) { > vd_printf("failed getting desktop path"); > return; > } > - if (!GetDiskFreeSpaceExA(file_path, &free_bytes, NULL, NULL)) { > + if (!GetDiskFreeSpaceEx(file_path, &free_bytes, NULL, NULL)) { > vd_printf("failed getting disk free space %lu", GetLastError()); > return; > } > @@ -87,25 +88,18 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, > return; > } > > - if (strlen(file_path) + strlen(file_name) + 1 >= MAX_PATH) { > - vd_printf("error: file too long %s\\%s", file_path, file_name); > + wlen = _tcslen(file_path); > + if (wlen + 3 >= MAX_PATH) { Why 3 ? > + vd_printf("error: file too long %ls\\%s", file_path, file_name); > return; > } > > - vdagent_strcat_s(file_path, sizeof(file_path), "\\"); > - vdagent_strcat_s(file_path, sizeof(file_path), file_name); > - if((wlen = MultiByteToWideChar(CP_UTF8, 0, file_path, -1, NULL, 0)) == 0){ > + file_path[wlen++] = TEXT('\\'); I'd add file_path[wlen] = TEXT('\0') as we currrently are going to try to print that string if an error occurs. > + if((wlen = MultiByteToWideChar(CP_UTF8, 0, file_name, -1, file_path + wlen, MAX_PATH - wlen)) == 0){ > vd_printf("failed getting WideChar length of %s", file_path); Rather vd_printf("failed converting file_name:%s to WideChar", file_name); > return; > } > - TCHAR *wfile_path = new TCHAR[wlen]; > - if (MultiByteToWideChar(CP_UTF8, 0, file_path, -1, wfile_path, wlen) == 0){ > - vd_printf("failed converting file_path:%s to WindChar", file_path); > - delete[] wfile_path; > - return; > - } > - handle = CreateFile(wfile_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); > - delete[] wfile_path; > + handle = CreateFile(file_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); > if (handle == INVALID_HANDLE_VALUE) { > vd_printf("failed creating %s %lu", file_path, GetLastError()); > return; > @@ -150,7 +144,7 @@ fin: > if (task) { > CloseHandle(task->handle); > if (status->result != VD_AGENT_FILE_XFER_STATUS_SUCCESS) { > - DeleteFileA(task->name); > + DeleteFile(task->name); > } > _tasks.erase(iter); > delete task; > @@ -176,7 +170,7 @@ void FileXfer::handle_status(VDAgentFileXferStatusMessage* status) > } > task = iter->second; > CloseHandle(task->handle); > - DeleteFileA(task->name); > + DeleteFile(task->name); > _tasks.erase(iter); > delete task; > } > diff --git a/vdagent/file_xfer.h b/vdagent/file_xfer.h > index 7ac911e..d9c65f3 100644 > --- a/vdagent/file_xfer.h > +++ b/vdagent/file_xfer.h > @@ -22,17 +22,18 @@ > #include "vdcommon.h" > > typedef struct ALIGN_VC FileXferTask { > - FileXferTask(HANDLE _handle, uint64_t _size, char* _name): > + FileXferTask(HANDLE _handle, uint64_t _size, const TCHAR* _name): > handle(_handle), size(_size), pos(0) { > // FIXME: should raise an error if name is too long.. > // currently the only user is FileXfer::handle_start > - // which verifies that strlen(_name) < MAX_PATH > - vdagent_strcpy_s(name, sizeof(name), _name); > + // which verifies that _tcslen(_name) < MAX_PATH > + lstrcpyn(name, _name, ARRAYSIZE(name)); > + name[ARRAYSIZE(name)-1] = 0; We switched from using strncpy to using strcpy_s in commit d752a5b6e0 to fix warnings in Visual Studio. Any idea if they are going to come back with lstrcpyn? Christophe
Attachment:
pgp3jeozTGoqF.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel