Second part of fix for bug 8310 - toupper_ascii() is broken on big-endian systems.
authorJeremy Allison <jra@samba.org>
Tue, 19 Jul 2011 20:08:31 +0000 (13:08 -0700)
committerKarolin Seeger <kseeger@samba.org>
Tue, 26 Jul 2011 19:54:36 +0000 (21:54 +0200)
Re-add:
    smb_ucs2_t toupper_w(smb_ucs2_t v);
    bool isupper_w(smb_ucs2_t v);
    smb_ucs2_t tolower_w(smb_ucs2_t v);
    bool islower_w(smb_ucs2_t v);

and ensure they are called whenever we are operating on smb_ucs2_t
variables. I'd like to make the definition of smb_ucs2_t incompatible
with int and codepoint_t so they can't be mixed, but that's a patch
for another time.
(cherry picked from commit bdc078a81e49bce3b51560a75984e0306c387573)

source3/include/proto.h
source3/lib/charcnv.c
source3/lib/ms_fnmatch.c
source3/lib/util_str.c
source3/lib/util_unistr.c

index cf418849d6b0c7a1f9599c0ed6e2a99ed7eec095..393dd77a36ffe62482728d65c56fcb80d0655a9e 100644 (file)
@@ -1051,6 +1051,10 @@ int strcmp_wa(const smb_ucs2_t *a, const char *b);
 int strncmp_wa(const smb_ucs2_t *a, const char *b, size_t len);
 smb_ucs2_t *strpbrk_wa(const smb_ucs2_t *s, const char *p);
 smb_ucs2_t *strstr_wa(const smb_ucs2_t *s, const char *ins);
+smb_ucs2_t toupper_w(smb_ucs2_t v);
+bool isupper_w(smb_ucs2_t v);
+smb_ucs2_t tolower_w(smb_ucs2_t v);
+bool islower_w(smb_ucs2_t v);
 
 /* The following definitions come from lib/version.c  */
 
index fd6cefe7e5e8585c8288b26d8f99e395b503b844..d3f65ca4e245b432050f24bdbaf6722c8b006efe 100644 (file)
@@ -1132,7 +1132,7 @@ size_t push_ucs2(const void *base_ptr, void *dest, const char *src, size_t dest_
                   terminated if STR_TERMINATE isn't set. */
 
                for (i = 0; i < (ret / 2) && i < (dest_len / 2) && dest_ucs2[i]; i++) {
-                       smb_ucs2_t v = toupper_m(dest_ucs2[i]);
+                       smb_ucs2_t v = toupper_w(dest_ucs2[i]);
                        if (v != dest_ucs2[i]) {
                                dest_ucs2[i] = v;
                        }
index 31c66953a961295706fb0f03b945ec1cc3af420e..bff7382940734f3b26adcaee6aeff21f6816fbd5 100644 (file)
@@ -129,7 +129,7 @@ static int ms_fnmatch_core(const smb_ucs2_t *p, const smb_ucs2_t *n,
                                if (is_case_sensitive) {
                                        return -1;
                                }
-                               if (toupper_m(c) != toupper_m(*n)) {
+                               if (toupper_w(c) != toupper_w(*n)) {
                                        return -1;
                                }
                        }
index 733db27b3633e46c89fcefef50364096ce031683..470152814e36bad86c925b88fbec4f9414780599 100644 (file)
@@ -460,7 +460,7 @@ bool strhasupper(const char *s)
        }
 
        for(p = tmp; *p != 0; p++) {
-               if(isupper_m(*p)) {
+               if(isupper_w(*p)) {
                        break;
                }
        }
@@ -485,7 +485,7 @@ bool strhaslower(const char *s)
        }
 
        for(p = tmp; *p != 0; p++) {
-               if(islower_m(*p)) {
+               if(islower_w(*p)) {
                        break;
                }
        }
index d8a360dfcc3df58f1153d1b491c99cb497fe3240..b8bece1e8179ec37fd5549a9bbaab45b61625a26 100644 (file)
@@ -254,7 +254,7 @@ bool strlower_w(smb_ucs2_t *s)
        bool ret = False;
 
        while (*(COPY_UCS2_CHAR(&cp,s))) {
-               smb_ucs2_t v = tolower_m(cp);
+               smb_ucs2_t v = tolower_w(cp);
                if (v != cp) {
                        COPY_UCS2_CHAR(s,&v);
                        ret = True;
@@ -276,7 +276,7 @@ bool strupper_w(smb_ucs2_t *s)
        smb_ucs2_t cp;
        bool ret = False;
        while (*(COPY_UCS2_CHAR(&cp,s))) {
-               smb_ucs2_t v = toupper_m(cp);
+               smb_ucs2_t v = toupper_w(cp);
                if (v != cp) {
                        COPY_UCS2_CHAR(s,&v);
                        ret = True;
@@ -334,11 +334,11 @@ int strcasecmp_w(const smb_ucs2_t *a, const smb_ucs2_t *b)
 {
        smb_ucs2_t cpa, cpb;
 
-       while ((*COPY_UCS2_CHAR(&cpb,b)) && toupper_m(*(COPY_UCS2_CHAR(&cpa,a))) == toupper_m(cpb)) {
+       while ((*COPY_UCS2_CHAR(&cpb,b)) && toupper_w(*(COPY_UCS2_CHAR(&cpa,a))) == toupper_w(cpb)) {
                a++;
                b++;
        }
-       return (tolower_m(*(COPY_UCS2_CHAR(&cpa,a))) - tolower_m(*(COPY_UCS2_CHAR(&cpb,b))));
+       return (tolower_w(*(COPY_UCS2_CHAR(&cpa,a))) - tolower_w(*(COPY_UCS2_CHAR(&cpb,b))));
 }
 
 /*******************************************************************
@@ -350,12 +350,12 @@ int strncasecmp_w(const smb_ucs2_t *a, const smb_ucs2_t *b, size_t len)
        smb_ucs2_t cpa, cpb;
        size_t n = 0;
 
-       while ((n < len) && *COPY_UCS2_CHAR(&cpb,b) && (toupper_m(*(COPY_UCS2_CHAR(&cpa,a))) == toupper_m(cpb))) {
+       while ((n < len) && *COPY_UCS2_CHAR(&cpb,b) && (toupper_w(*(COPY_UCS2_CHAR(&cpa,a))) == toupper_w(cpb))) {
                a++;
                b++;
                n++;
        }
-       return (len - n)?(tolower_m(*(COPY_UCS2_CHAR(&cpa,a))) - tolower_m(*(COPY_UCS2_CHAR(&cpb,b)))):0;
+       return (len - n)?(tolower_w(*(COPY_UCS2_CHAR(&cpa,a))) - tolower_w(*(COPY_UCS2_CHAR(&cpb,b)))):0;
 }
 
 /*******************************************************************
@@ -606,3 +606,37 @@ smb_ucs2_t *strstr_wa(const smb_ucs2_t *s, const char *ins)
 
        return NULL;
 }
+
+smb_ucs2_t toupper_w(smb_ucs2_t v)
+{
+       smb_ucs2_t ret;
+       /* LE to native. */
+       codepoint_t cp = SVAL(&v,0);
+       cp = toupper_m(cp);
+       /* native to LE. */
+       SSVAL(&ret,0,cp);
+       return ret;
+}
+
+bool isupper_w(smb_ucs2_t v)
+{
+       codepoint_t cp = SVAL(&v,0);
+       return isupper_m(cp);
+}
+
+smb_ucs2_t tolower_w(smb_ucs2_t v)
+{
+       smb_ucs2_t ret;
+       /* LE to native. */
+       codepoint_t cp = SVAL(&v,0);
+       cp = tolower_m(cp);
+       /* native to LE. */
+       SSVAL(&ret,0,cp);
+       return ret;
+}
+
+bool islower_w(smb_ucs2_t v)
+{
+       codepoint_t cp = SVAL(&v,0);
+       return islower_m(cp);
+}