]> git.sur5r.net Git - openldap/commitdiff
ITS#7992 Tighter utf8_to_utf16(), fix errcodes
authorHallvard Furuseth <hallvard@openldap.org>
Tue, 6 Sep 2016 16:12:01 +0000 (18:12 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Sun, 25 Sep 2016 13:40:08 +0000 (15:40 +0200)
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

index 087cb98bc1e753fa9a1c67ca4e8f524a802bbc8d..b0da3856f9fdaa5415c68bbb0b2463fee273785c 100644 (file)
@@ -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) */
+/** @} */