]> 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>
Thu, 15 Dec 2016 21:27:33 +0000 (22:27 +0100)
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 36d50b82bbb587fd07cfbef7a9d00aad78597a59..4e4385c04c547846dd71d779e96bfce435524a59 100644 (file)
@@ -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) */
+/** @} */