]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ldb: ldb_comparison_fold_ascii sorts unsigned
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 9 May 2024 05:21:29 +0000 (17:21 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 22 May 2024 23:12:32 +0000 (23:12 +0000)
Typically in 8-bit character sets, those with the 0x80 bit set are
seen as 288-255, not negative numbers. This will sort them after 'Z',
not before 'A'.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/ldb/common/ldb_utf8.c

index baabbced37c953e86e7baf4b768c4a4d2d72690f..e81317839cf6e77a5fce8a82135d700706cd6d2c 100644 (file)
@@ -97,7 +97,8 @@ int ldb_comparison_fold_ascii(void *ignored,
                              const struct ldb_val *v1,
                              const struct ldb_val *v2)
 {
-       const char *s1=(const char *)v1->data, *s2=(const char *)v2->data;
+       const uint8_t *s1 = v1->data;
+       const uint8_t *s2 = v2->data;
        size_t n1 = v1->length, n2 = v2->length;
 
        while (n1 && *s1 == ' ') { s1++; n1--; };
@@ -127,15 +128,15 @@ int ldb_comparison_fold_ascii(void *ignored,
                while (n2 && *s2 == ' ') { s2++; n2--; }
        }
        if (n1 == 0 && n2 != 0) {
-               return -(int)ldb_ascii_toupper(*s2);
+               return *s2 ? -1 : 0;
        }
        if (n2 == 0 && n1 != 0) {
-               return (int)ldb_ascii_toupper(*s1);
+               return *s1 ? 1 : 0;
        }
        if (n1 == 0 && n2 == 0) {
                return 0;
        }
-       return (int)ldb_ascii_toupper(*s1) - (int)ldb_ascii_toupper(*s2);
+       return NUMERIC_CMP(*s1, *s2);
 }
 
 void ldb_set_utf8_default(struct ldb_context *ldb)