]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/unicode/util_unistr.c
Merge master
[netatalk.git] / libatalk / unicode / util_unistr.c
index 416c38d0b86d5aaf098a5d09fb8891569fc8c324..aec13c820d35d5d87c0153acfda99abe56e7a1da 100644 (file)
@@ -552,8 +552,6 @@ size_t precompose_w (ucs2_t *name, size_t inplen, ucs2_t *comp, size_t *outlen)
        base = *in;
        while (*outlen > 2) {
                i += 2;
-               in++;
-
                if (i == inplen) {
                        *out = base;
                        out++;
@@ -561,7 +559,7 @@ size_t precompose_w (ucs2_t *name, size_t inplen, ucs2_t *comp, size_t *outlen)
                        *outlen -= 2;
                        return o_len - *outlen;
                }
-
+               in++;
                comb = *in;
                result = 0;
 
@@ -589,7 +587,7 @@ size_t precompose_w (ucs2_t *name, size_t inplen, ucs2_t *comp, size_t *outlen)
                
                /* Binary Search for Surrogate Pair */
                else if ((0xD800 <= base) && (base < 0xDC00)) {
-                       if ((0xDC00 <= comb) && (comb < 0xE000) && (i + 4 <= inplen)) {
+                       if ((0xDC00 <= comb) && (comb < 0xE000) && (i + 6 <= inplen)) {
                                base_sp = ((uint32_t)base << 16) | (uint32_t)comb;
                                do {
                                        comb_sp = ((uint32_t)in[1] << 16) | (uint32_t)in[2];
@@ -598,7 +596,7 @@ size_t precompose_w (ucs2_t *name, size_t inplen, ucs2_t *comp, size_t *outlen)
                                                i += 4;
                                                in +=2;
                                        }
-                               } while ((i + 4 <= inplen) && result_sp) ;
+                               } while ((i + 6 <= inplen) && result_sp) ;
 
                                *out = base_sp >> 16;
                                out++;
@@ -614,6 +612,11 @@ size_t precompose_w (ucs2_t *name, size_t inplen, ucs2_t *comp, size_t *outlen)
                                *outlen -= 2;
 
                                i += 2;
+                               if (i == inplen) {
+                                       out++;
+                                       *out = 0;
+                                       return o_len - *outlen;
+                               }
                                in++;
                                base = *in;