mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-26 00:32:54 -05:00
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.
This commit is contained in:
parent
e674f8241c
commit
f2ecddbcf7
1 changed files with 23 additions and 17 deletions
|
|
@ -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;
|
int rc, need = 0;
|
||||||
wchar_t *result;
|
wchar_t *result = NULL;
|
||||||
need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, NULL, 0);
|
for (;;) { /* malloc result, then fill it in */
|
||||||
if (need == 0xFFFD)
|
need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
|
||||||
return EILSEQ;
|
if (!need) {
|
||||||
if (need == 0)
|
rc = ErrCode();
|
||||||
return EINVAL;
|
free(result);
|
||||||
result = malloc(sizeof(wchar_t) * need);
|
return rc;
|
||||||
if (!result)
|
}
|
||||||
return ENOMEM;
|
if (!result) {
|
||||||
MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
|
result = malloc(sizeof(wchar_t) * need);
|
||||||
if (dstsize)
|
if (!result)
|
||||||
*dstsize = need;
|
return ENOMEM;
|
||||||
*dst = result;
|
continue;
|
||||||
return 0;
|
}
|
||||||
|
if (dstsize)
|
||||||
|
*dstsize = need;
|
||||||
|
*dst = result;
|
||||||
|
return MDB_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* defined(_WIN32) */
|
#endif /* defined(_WIN32) */
|
||||||
|
/** @} */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue