From: Hallvard Furuseth Date: Tue, 6 Sep 2016 16:12:01 +0000 (+0200) Subject: ITS#7992 Tighter utf8_to_utf16(), fix errcodes X-Git-Tag: LMDB_0.9.19~17 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f2ecddbcf76dec209de2e4d15f2a2d7eb41ce20f;p=openldap 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. --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 36d50b82bb..4e4385c04c 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -10104,25 +10104,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) */ +/** @} */