summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2014-11-14 08:43:22 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2014-11-14 08:43:22 +0100
commit6a52622d235d713c8ed7779cd6640fe36f48cbed (patch)
tree8c704fb63fc0d32531ee905a4a2242be1e06ff5e
parentf97fbf798196d6cf36ed08435d072ae3067b6fd5 (diff)
downloadgnutls-6a52622d235d713c8ed7779cd6640fe36f48cbed.tar.gz
windows: updated _gnutls_ucs2_to_utf8()
-rw-r--r--lib/system.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/lib/system.c b/lib/system.c
index 110fec9fe0..b851110ce3 100644
--- a/lib/system.c
+++ b/lib/system.c
@@ -577,24 +577,43 @@ int _gnutls_ucs2_to_utf8(const void *data, size_t size,
int len = 0, src_len;
char *dst = NULL;
char *src = NULL;
+ static unsigned flags = 0;
+ static int checked = 0;
+
+ if (checked == 0) {
+ /* Not all windows versions support MB_ERR_INVALID_CHARS */
+ ret =
+ WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS,
+ L"hello", -1, NULL, 0, NULL, NULL);
+ if (ret > 0)
+ flags = MB_ERR_INVALID_CHARS;
+ checked = 1;
+ }
+
+ if (((uint8_t *) data)[size] == 0 && ((uint8_t *) data)[size+1] == 0) {
+ size -= 2;
+ }
- src_len = size / 2;
+ src_len = wcslen(data);
- src = gnutls_malloc(size);
+ src = gnutls_malloc(size+2);
if (src == NULL)
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
/* convert to LE */
for (i = 0; i < size; i += 2) {
- src[i] = ((char *) data)[1 + i];
- src[1 + i] = ((char *) data)[i];
+ src[i] = ((uint8_t *) data)[1 + i];
+ src[1 + i] = ((uint8_t *) data)[i];
}
+ src[size] = 0;
+ src[size+1] = 0;
ret =
- WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS,
- (void *) src, src_len, NULL, 0, NULL,
- NULL);
+ WideCharToMultiByte(CP_UTF8, flags,
+ (void *) src, src_len, NULL, 0,
+ NULL, NULL);
if (ret == 0) {
+ _gnutls_debug_log("WideCharToMultiByte: %d\n", (int)GetLastError());
ret = gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
goto fail;
}
@@ -605,19 +624,21 @@ int _gnutls_ucs2_to_utf8(const void *data, size_t size,
ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
goto fail;
}
+ dst[0] = 0;
ret =
- WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS,
- (void *) src, src_len, dst, len, NULL,
+ WideCharToMultiByte(CP_UTF8, flags,
+ (void *) src, src_len, dst, len-1, NULL,
NULL);
if (ret == 0) {
ret = gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
goto fail;
}
-
dst[len - 1] = 0;
+
output->data = dst;
output->size = ret;
+
ret = 0;
goto cleanup;