From 67fb3c746a43bf2d2ce4834ede5fba940c9286a5 Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Tue, 6 Sep 2016 18:12:01 +0200 Subject: [PATCH] ITS#7992 Tighter utf8_to_utf16(), fix errcodes The 0xFFFD check seems due to misleading MultiByteToWideChar() doc. Bad UTF-8 gives 0xFFFD in the output string, not the return value. --- libraries/liblmdb/mdb.c | 42 +++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 087cb98..b0da385 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -10886,25 +10886,31 @@ mdb_mutex_failed(MDB_env *env, mdb_mutexref_t mutex, int rc) return rc; } #endif /* MDB_ROBUST_SUPPORTED */ -/** @} */ #if defined(_WIN32) -static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize) -{ - int need; - wchar_t *result; - need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, NULL, 0); - if (need == 0xFFFD) - return EILSEQ; - if (need == 0) - return EINVAL; - result = malloc(sizeof(wchar_t) * need); - if (!result) - return ENOMEM; - MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need); - if (dstsize) - *dstsize = need; - *dst = result; - return 0; +static int ESECT +utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize) +{ + int rc, need = 0; + wchar_t *result = NULL; + for (;;) { /* malloc result, then fill it in */ + need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need); + if (!need) { + rc = ErrCode(); + free(result); + return rc; + } + if (!result) { + result = malloc(sizeof(wchar_t) * need); + if (!result) + return ENOMEM; + continue; + } + if (dstsize) + *dstsize = need; + *dst = result; + return MDB_SUCCESS; + } } #endif /* defined(_WIN32) */ +/** @} */