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; return rc;
} }
#endif /* MDB_ROBUST_SUPPORTED */ #endif /* MDB_ROBUST_SUPPORTED */
/** @} */
#if defined(_WIN32) #if defined(_WIN32)
static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize) static int ESECT
{ utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize)
int need; {
wchar_t *result; int rc, need = 0;
need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, NULL, 0); wchar_t *result = NULL;
if (need == 0xFFFD) for (;;) { /* malloc result, then fill it in */
return EILSEQ; need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
if (need == 0) if (!need) {
return EINVAL; rc = ErrCode();
result = malloc(sizeof(wchar_t) * need); free(result);
if (!result) return rc;
return ENOMEM; }
MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need); if (!result) {
if (dstsize) result = malloc(sizeof(wchar_t) * need);
*dstsize = need; if (!result)
*dst = result; return ENOMEM;
return 0; continue;
}
if (dstsize)
*dstsize = need;
*dst = result;
return MDB_SUCCESS;
}
} }
#endif /* defined(_WIN32) */ #endif /* defined(_WIN32) */
/** @} */

Loading…
Cancel
Save