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.
mdb.RE/0.9
Hallvard Furuseth 8 years ago
parent e674f8241c
commit f2ecddbcf7
  1. 42
      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) */
/** @} */

Loading…
Cancel
Save