From 49da240a9c955e26356b6ce054ddfb937c66f650 Mon Sep 17 00:00:00 2001 From: Manoj Ampalam Date: Mon, 17 Oct 2016 22:11:51 -0700 Subject: [PATCH] Cleaning up stringhelp.c --- contrib/win32/openssh/win32compat.vcxproj | 1 - .../win32/openssh/win32compat.vcxproj.filters | 3 - contrib/win32/win32compat/fileio.c | 20 +- .../win32/win32compat/ssh-agent/agentconfig.c | 17 +- contrib/win32/win32compat/stringhelp.c | 198 ------------------ contrib/win32/win32compat/stringhelp.h | 48 ----- 6 files changed, 22 insertions(+), 265 deletions(-) delete mode 100644 contrib/win32/win32compat/stringhelp.c delete mode 100644 contrib/win32/win32compat/stringhelp.h diff --git a/contrib/win32/openssh/win32compat.vcxproj b/contrib/win32/openssh/win32compat.vcxproj index c1383d7..a629fcd 100644 --- a/contrib/win32/openssh/win32compat.vcxproj +++ b/contrib/win32/openssh/win32compat.vcxproj @@ -153,7 +153,6 @@ - diff --git a/contrib/win32/openssh/win32compat.vcxproj.filters b/contrib/win32/openssh/win32compat.vcxproj.filters index ba02e95..c651d8f 100644 --- a/contrib/win32/openssh/win32compat.vcxproj.filters +++ b/contrib/win32/openssh/win32compat.vcxproj.filters @@ -63,9 +63,6 @@ Source Files - - Source Files - Source Files diff --git a/contrib/win32/win32compat/fileio.c b/contrib/win32/win32compat/fileio.c index 17fe2a2..415c14c 100644 --- a/contrib/win32/win32compat/fileio.c +++ b/contrib/win32/win32compat/fileio.c @@ -36,6 +36,7 @@ #include "inc/defs.h" #include #include +#include "inc\utf.h" /* internal read buffer size */ #define READ_BUFFER_SIZE 100*1024 @@ -238,39 +239,40 @@ createFile_flags_setup(int flags, int mode, struct createFile_flags* cf_flags) { /* open() implementation. Uses CreateFile to open file, console, device, etc */ struct w32_io* - fileio_open(const char *pathname, int flags, int mode) { + fileio_open(const char *path_utf8, int flags, int mode) { struct w32_io* pio = NULL; struct createFile_flags cf_flags; HANDLE handle; - wchar_t wpathname[MAX_PATH]; + wchar_t *path_utf16 = NULL; - debug2("open - pathname:%s, flags:%d, mode:%d", pathname, flags, mode); + debug2("open - pathname:%s, flags:%d, mode:%d", path_utf8, flags, mode); /* check input params*/ - if (pathname == NULL) { + if (path_utf8 == NULL) { errno = EINVAL; debug("open - ERROR:%d", errno); return NULL; } - if (MultiByteToWideChar(CP_UTF8, 0, pathname, -1, wpathname, MAX_PATH) == 0) { - errno = EFAULT; - debug("WideCharToMultiByte failed - ERROR:%d", GetLastError()); + if ((path_utf16 = utf8_to_utf16(path_utf8)) == NULL) { + errno = ENOMEM; + debug("utf8_to_utf16 failed - ERROR:%d", GetLastError()); return NULL; } if (createFile_flags_setup(flags, mode, &cf_flags) == -1) return NULL; - handle = CreateFileW(wpathname, cf_flags.dwDesiredAccess, cf_flags.dwShareMode, + handle = CreateFileW(path_utf16, cf_flags.dwDesiredAccess, cf_flags.dwShareMode, &cf_flags.securityAttributes, cf_flags.dwCreationDisposition, cf_flags.dwFlagsAndAttributes, NULL); if (handle == INVALID_HANDLE_VALUE) { errno = errno_from_Win32LastError(); debug("open - CreateFile ERROR:%d", GetLastError()); + free(path_utf16); return NULL; } - + free(path_utf16); pio = (struct w32_io*)malloc(sizeof(struct w32_io)); if (pio == NULL) { CloseHandle(handle); diff --git a/contrib/win32/win32compat/ssh-agent/agentconfig.c b/contrib/win32/win32compat/ssh-agent/agentconfig.c index c0ed77d..b7c8bd2 100644 --- a/contrib/win32/win32compat/ssh-agent/agentconfig.c +++ b/contrib/win32/win32compat/ssh-agent/agentconfig.c @@ -116,13 +116,18 @@ int config_log_level() { int pubkey_allowed(struct sshkey* pubkey, wchar_t* wuser, wchar_t* wuser_home) { struct passwd pw; - char user[256], user_home[MAX_PATH]; + int ret; + char *user = NULL, *user_home = NULL; memset(&pw, 0, sizeof(pw)); - if (WideCharToMultiByte(CP_UTF8, 0, wuser, -1, user, 256, NULL, NULL) == 0) - return 0; - WideCharToMultiByte(CP_UTF8, 0, wuser_home, -1, user_home, MAX_PATH, NULL, NULL); - pw.pw_dir = user_home; + if ((user_home = utf16_to_utf8(wuser_home)) == NULL || + (user = utf16_to_utf8(wuser)) == NULL) + return 0; + + pw.pw_dir = user_home; pw.pw_name = user; - return user_key_allowed(&pw, pubkey, 1); + ret = user_key_allowed(&pw, pubkey, 1); + free(user); + free(user_home); + return ret; } \ No newline at end of file diff --git a/contrib/win32/win32compat/stringhelp.c b/contrib/win32/win32compat/stringhelp.c deleted file mode 100644 index 6f87a0a..0000000 --- a/contrib/win32/win32compat/stringhelp.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Author: NoMachine - * - * Copyright (c) 2009, 2010 NoMachine - * All rights reserved - * - * Support functions and system calls' replacements needed to let the - * software run on Win32 based operating systems. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#include -#include "Debug.h" - -#undef DEBUG - -#ifdef DEBUG -# define DBG_MSG(...) debug3(__VA_ARGS__) -#else -# define DBG_MSG(...) -#endif - -#define SocketErrorStringSize 1024 - -/* - * Convert string encoding from one 8-bit CP to another 8-bit CP. - * WARNING: Returned string MUST be freed by caller. - * - * src - source string (IN). - * srcSize - size of src string in bytes or -1 if zero terminated (IN). - * srcCP - code page used by src string (IN). - * dstCP - target code page (IN). - * retSize - size of returned string, may be NULL (OUT/OPTIONAL). - * - * RETURNS: Pointer to new allocated string encoded in target CP - * or NULL if error. - * - */ -void *ConvertCodePage(const char *src, int srcSize, - DWORD srcCP, DWORD dstCP, int *retSize) -{ - int exitCode = -1; - - int utf16Len = 0; - int dstLen = 0; - - wchar_t *utf16 = NULL; - - char *ret = NULL; - - DBG_MSG("-> ConvertCodePage(src=[%s], srcSize=[%d])...", src, srcSize); - - /* - * Check args. - */ - - FAIL(src == NULL); - - /* - * Retrieve size for UTF16. - */ - - DBG_MSG("Retrieving size of UTF16..."); - - utf16Len = MultiByteToWideChar(srcCP, 0, src, srcSize, NULL, 0); - - FAIL(utf16Len <= 0); - - /* - * Allocate buffer for UTF16. - */ - - DBG_MSG("Allocating [%d] bytes for UTF16...", utf16Len * sizeof(wchar_t)); - - utf16 = (wchar_t *) malloc((utf16Len + 1) * sizeof(wchar_t)); - - FAIL(utf16 == NULL); - - /* - * Convert src to UTF16. - */ - - DBG_MSG("Allocating [%d] bytes for UTF16...", utf16Len * sizeof(wchar_t)); - - FAIL(MultiByteToWideChar(srcCP, 0, src, srcSize, utf16, utf16Len) < 0); - - /* - * Allocate buffer for return. - */ - - DBG_MSG("Allocating buffer for dst..."); - - dstLen = WideCharToMultiByte(dstCP, 0, utf16, -1, NULL, 0, NULL, NULL); - - ret = malloc(dstLen + 1); - - FAIL(ret == NULL); - - ret[dstLen] = 0; - - /* - * Convert utf16 to target CP. - */ - - DBG_MSG("Converting UTF16 to dst..."); - - dstLen = WideCharToMultiByte(dstCP, 0, utf16, utf16Len, - ret, dstLen + 1, NULL, NULL); - - FAIL(dstLen < 0); - - if (retSize) - { - *retSize = dstLen; - } - - /* - * Clean up. - */ - - exitCode = 0; - - fail: - - if (exitCode) - { - debug3("ERROR: Cannot convert [%s] from CP[0x%x] to CP[0x%x]." - "Error code is : %d.\n", src, srcCP, dstCP, GetLastError()); - - if (ret) - { - free(ret); - - ret = NULL; - } - } - - if (utf16) - { - free(utf16); - } - - DBG_MSG("<- ConvertCodePage()..."); - - return ret; -} - -/* - * Convert string from UTF8 to CP used by current thread (Local8). - * - * utf8 - string in UTF8 (IN). - * utf8Size - size of utf8 string in bytes or -1 if zero terminated (IN). - * bytesReturned - size of returned Local8 string (OUT). - * - * RETURNS: Pointer to new allocated Local8 string or NULL if error. - */ - -void *ConvertUtf8ToLocal8(const char *utf8, int utf8Size, int *bytesReturned) -{ - return ConvertCodePage(utf8, utf8Size, CP_UTF8, GetACP(), bytesReturned); -} - -/* - * Convert string from CP used by current thread (Local8) to UTF8. - * - * local8 - string in Local8 CP (IN). - * local8Size - size of local8 string in bytes or -1 if zero terminated (IN). - * bytesReturned - size of returned UTF8 string (OUT). - * - * RETURNS: Pointer to new allocated UTF8 string or NULL if error. - */ - -void *ConvertLocal8ToUtf8(const char *local8, int local8Size, int *bytesReturned) -{ - return ConvertCodePage(local8, local8Size, - GetACP(), CP_UTF8, bytesReturned); -} diff --git a/contrib/win32/win32compat/stringhelp.h b/contrib/win32/win32compat/stringhelp.h deleted file mode 100644 index e3af1fa..0000000 --- a/contrib/win32/win32compat/stringhelp.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Author: NoMachine - * - * Copyright (c) 2009, 2010 NoMachine - * All rights reserved - * - * Support functions and system calls' replacements needed to let the - * software run on Win32 based operating systems. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef StringHelp_H -#define StringHelp_H 1 - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void *ConvertCodePage(const char *src, int srcSize, DWORD srcCP, DWORD dstCP, int *retSize); -void *ConvertUtf8ToLocal8(const char *utf8, int utf8Size, int *bytesReturned); - -#ifdef __cplusplus -}; -#endif - -#endif /* StringHelp_H */