@@ -247,17 +247,16 @@
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;
}
@@ -89,8 +89,40 @@
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
+ */
+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);
Attention is currently required from: flichtenheld, plaisthos. Hello plaisthos, flichtenheld, I'd like you to do a code review. Please visit http://gerrit.openvpn.net/c/openvpn/+/836?usp=email to review the following change. Change subject: service: add utf8to16 function that takes a size ...................................................................... service: add utf8to16 function that takes a size 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 <heiko@ist.eigentlich.net> --- M src/openvpnserv/common.c M src/openvpnserv/service.h 2 files changed, 37 insertions(+), 6 deletions(-) git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/36/836/1