Fix mb bug in fast path code. strlen_w() returns number of *characters*
authorJeremy Allison <jra@samba.org>
Wed, 10 Sep 2003 02:21:24 +0000 (02:21 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 10 Sep 2003 02:21:24 +0000 (02:21 +0000)
not number of bytes. Reproduce this by trying to rename the file named :
sibréseau -> sibréseaU
from Windows 2000 explorer.
Jeremy.
(This used to be commit 035f59599514491609078ac0fe5804278c43a9b3)

source3/lib/charcnv.c

index 5f3cf64a6852723a95e156dea8fe346aeb858947..e8ae40dbe294d9cffa85f0694ec44a8aae97ba30 100644 (file)
@@ -284,7 +284,7 @@ size_t convert_string(charset_t from, charset_t to,
 
                /* If all characters are ascii, fast path here. */
                while ((srclen >= 2) && destlen) {
-                       if ((lastp = *p) <= 0x7f && p[1] == 0) {
+                       if (((lastp = *p) <= 0x7f) && (p[1] == 0)) {
                                *q++ = *p;
                                if (srclen != (size_t)-1) {
                                        srclen -= 2;
@@ -296,7 +296,7 @@ size_t convert_string(charset_t from, charset_t to,
                                        break;
                        } else {
                                if (srclen == (size_t)-1) {
-                                       srclen = strlen_w((const void *)p)+2;
+                                       srclen = (strlen_w((const smb_ucs2_t *)p)+1) * 2;
                                }
                                return retval + convert_string_internal(from, to, p, srclen, q, destlen);
                        }
@@ -542,7 +542,7 @@ char *strdup_upper(const char *s)
 
                strupper_w(buffer);
        
-               size = convert_string(CH_UCS2, CH_UNIX, buffer, sizeof(buffer), out_buffer, sizeof(out_buffer));
+               size = convert_string(CH_UCS2, CH_UNIX, buffer, -1, out_buffer, sizeof(out_buffer));
                if (size == -1) {
                        return NULL;
                }