Skip to content

Commit

Permalink
service: add utf8to16 function that takes a size
Browse files Browse the repository at this point in the history
utf8to16_size() takes the size of the to be converted string. This is
needed to convert MULTI_SZ strings, which contain inline NUL characters,
but can be useful in other cases as well.

Change-Id: I6b4aa3d63c0b684bf95841271c04bc5d9c37793b
Signed-off-by: Heiko Hund <[email protected]>
Acked-by: Frank Lichtenheld <[email protected]>
Acked-by: Gert Doering <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg30158.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
d12fk authored and cron2 committed Dec 22, 2024
1 parent 5d3d2e4 commit d92df90
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 6 deletions.
7 changes: 3 additions & 4 deletions src/openvpnserv/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,17 +247,16 @@ MsgToEventLog(DWORD flags, LPCTSTR format, ...)
return error;
}

/* Convert a utf8 string to utf16. Caller should free the result */
wchar_t *
utf8to16(const char *utf8)
utf8to16_size(const char *utf8, int size)
{
int n = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
int n = MultiByteToWideChar(CP_UTF8, 0, utf8, size, NULL, 0);
wchar_t *utf16 = malloc(n * sizeof(wchar_t));
if (!utf16)
{
return NULL;
}
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, n);
MultiByteToWideChar(CP_UTF8, 0, utf8, size, utf16, n);
return utf16;
}

Expand Down
36 changes: 34 additions & 2 deletions src/openvpnserv/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,40 @@ LPCTSTR GetLastErrorText();

DWORD MsgToEventLog(DWORD flags, LPCTSTR lpszMsg, ...);

/* Convert a utf8 string to utf16. Caller should free the result */
wchar_t *utf8to16(const char *utf8);
/**
* Convert a UTF-8 string to UTF-16
*
* The size parameter can be used to convert strings which contain inline NUL
* characters, like MULTI_SZ strings used as values in the registry do,
* or (sub)strings that are not zero terminated. If size is -1 the length
* of the string is determined automatically by the WIN32 API. Make sure
* you pass a terminated string or else bad things will happen. Note that
* the size you pass should always include the terminating zero as well.
*
* If the returned string is not NULL it must be freed by the caller.
*
* @param utf8 const string to be converted
* @param size the size of the string
*
* @return wchar_t* heap allocated result string
*/
wchar_t *utf8to16_size(const char *utf8, int size);

/**
* Convert a zero terminated UTF-8 string to UTF-16
*
* This is just a wrapper function that always passes -1 as string size
* to \ref utf8to16_size.
*
* @param utf8 const string to be converted
*
* @return wchar_t* heap allocated result string
*/
static inline wchar_t *
utf8to16(const char *utf8)
{
return utf8to16_size(utf8, -1);
}

/* return windows system directory as a pointer to a static string */
const wchar_t *get_win_sys_path(void);
Expand Down

0 comments on commit d92df90

Please sign in to comment.