summaryrefslogtreecommitdiff
path: root/lib/util
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2017-09-06 09:47:20 +0200
committerStefan Metzmacher <metze@samba.org>2017-09-16 09:24:12 +0200
commit11048d4f1e02615b1d20343c6c479b955342e7eb (patch)
treea800d8171c54f5ed0afdfdea5b80cd7bd2ad07a0 /lib/util
parent16308387b5e1bcda7bbaf7d6cf947948ba3cb409 (diff)
downloadsamba-11048d4f1e02615b1d20343c6c479b955342e7eb.tar.gz
charset: fix str[n]casecmp_m() by comparing lower case values
The commits c615ebed6e3d273a682806b952d543e834e5630d^..f19ab5d334e3fb15761fb009e5de876dfc6ea785 replaced Str[n]CaseCmp() by str[n]casecmp_m(). The logic we had in str[n]casecmp_w() used to compare the upper cased as well as the lower cased versions of the characters and returned the difference between the lower cased versions. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13018 Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org> Autobuild-User(master): Ralph Böhme <slow@samba.org> Autobuild-Date(master): Fri Sep 15 02:23:29 CEST 2017 on sn-devel-144 (cherry picked from commit 3ed9c903671e795964ce3da9d0080444ef3eb5e9)
Diffstat (limited to 'lib/util')
-rw-r--r--lib/util/charset/util_str.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/lib/util/charset/util_str.c b/lib/util/charset/util_str.c
index 550fba3ed64..6feed1742ac 100644
--- a/lib/util/charset/util_str.c
+++ b/lib/util/charset/util_str.c
@@ -36,6 +36,8 @@ _PUBLIC_ int strcasecmp_m_handle(struct smb_iconv_handle *iconv_handle,
const char *s1, const char *s2)
{
codepoint_t c1=0, c2=0;
+ codepoint_t u1=0, u2=0;
+ codepoint_t l1=0, l2=0;
size_t size1, size2;
/* handle null ptr comparisons to simplify the use in qsort */
@@ -59,9 +61,19 @@ _PUBLIC_ int strcasecmp_m_handle(struct smb_iconv_handle *iconv_handle,
continue;
}
- if (toupper_m(c1) != toupper_m(c2)) {
- return c1 - c2;
+ u1 = toupper_m(c1);
+ u2 = toupper_m(c2);
+ if (u1 == u2) {
+ continue;
}
+
+ l1 = tolower_m(c1);
+ l2 = tolower_m(c2);
+ if (l1 == l2) {
+ continue;
+ }
+
+ return l1 - l2;
}
return *s1 - *s2;
@@ -83,6 +95,8 @@ _PUBLIC_ int strncasecmp_m_handle(struct smb_iconv_handle *iconv_handle,
const char *s1, const char *s2, size_t n)
{
codepoint_t c1=0, c2=0;
+ codepoint_t u1=0, u2=0;
+ codepoint_t l1=0, l2=0;
size_t size1, size2;
/* handle null ptr comparisons to simplify the use in qsort */
@@ -123,9 +137,19 @@ _PUBLIC_ int strncasecmp_m_handle(struct smb_iconv_handle *iconv_handle,
continue;
}
- if (toupper_m(c1) != toupper_m(c2)) {
- return c1 - c2;
+ u1 = toupper_m(c1);
+ u2 = toupper_m(c2);
+ if (u1 == u2) {
+ continue;
}
+
+ l1 = tolower_m(c1);
+ l2 = tolower_m(c2);
+ if (l1 == l2) {
+ continue;
+ }
+
+ return l1 - l2;
}
if (n == 0) {