mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 10:03:43 +00:00
git__strcasecmp: treat input bytes as unsigned
Treat input bytes as unsigned before doing arithmetic on them, lest we look at some non-ASCII byte (like a UTF-8 character) as a negative value and perform the comparison incorrectly.
This commit is contained in:
parent
c7f9412356
commit
006548da91
@ -173,7 +173,7 @@ int git__strcasecmp(const char *a, const char *b)
|
|||||||
{
|
{
|
||||||
while (*a && *b && tolower(*a) == tolower(*b))
|
while (*a && *b && tolower(*a) == tolower(*b))
|
||||||
++a, ++b;
|
++a, ++b;
|
||||||
return (tolower(*a) - tolower(*b));
|
return ((unsigned char)tolower(*a) - (unsigned char)tolower(*b));
|
||||||
}
|
}
|
||||||
|
|
||||||
int git__strcasesort_cmp(const char *a, const char *b)
|
int git__strcasesort_cmp(const char *a, const char *b)
|
||||||
@ -193,7 +193,7 @@ int git__strcasesort_cmp(const char *a, const char *b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*a || *b)
|
if (*a || *b)
|
||||||
return tolower(*a) - tolower(*b);
|
return (unsigned char)tolower(*a) - (unsigned char)tolower(*b);
|
||||||
|
|
||||||
return cmp;
|
return cmp;
|
||||||
}
|
}
|
||||||
|
@ -39,3 +39,41 @@ void test_core_string__2(void)
|
|||||||
cl_assert(git__strcasesort_cmp("BAR", "foo") < 0);
|
cl_assert(git__strcasesort_cmp("BAR", "foo") < 0);
|
||||||
cl_assert(git__strcasesort_cmp("fooBar", "foobar") < 0);
|
cl_assert(git__strcasesort_cmp("fooBar", "foobar") < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_core_string__strcmp(void)
|
||||||
|
{
|
||||||
|
cl_assert(git__strcmp("", "") == 0);
|
||||||
|
cl_assert(git__strcmp("foo", "foo") == 0);
|
||||||
|
cl_assert(git__strcmp("Foo", "foo") < 0);
|
||||||
|
cl_assert(git__strcmp("foo", "FOO") > 0);
|
||||||
|
cl_assert(git__strcmp("foo", "fOO") > 0);
|
||||||
|
|
||||||
|
cl_assert(strcmp("rt\303\202of", "rt dev\302\266h") > 0);
|
||||||
|
cl_assert(strcmp("e\342\202\254ghi=", "et") > 0);
|
||||||
|
cl_assert(strcmp("rt dev\302\266h", "rt\303\202of") < 0);
|
||||||
|
cl_assert(strcmp("et", "e\342\202\254ghi=") < 0);
|
||||||
|
|
||||||
|
cl_assert(git__strcmp("rt\303\202of", "rt dev\302\266h") > 0);
|
||||||
|
cl_assert(git__strcmp("e\342\202\254ghi=", "et") > 0);
|
||||||
|
cl_assert(git__strcmp("rt dev\302\266h", "rt\303\202of") < 0);
|
||||||
|
cl_assert(git__strcmp("et", "e\342\202\254ghi=") < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_core_string__strcasecmp(void)
|
||||||
|
{
|
||||||
|
cl_assert(git__strcasecmp("", "") == 0);
|
||||||
|
cl_assert(git__strcasecmp("foo", "foo") == 0);
|
||||||
|
cl_assert(git__strcasecmp("foo", "Foo") == 0);
|
||||||
|
cl_assert(git__strcasecmp("foo", "FOO") == 0);
|
||||||
|
cl_assert(git__strcasecmp("foo", "fOO") == 0);
|
||||||
|
|
||||||
|
cl_assert(strcasecmp("rt\303\202of", "rt dev\302\266h") > 0);
|
||||||
|
cl_assert(strcasecmp("e\342\202\254ghi=", "et") > 0);
|
||||||
|
cl_assert(strcasecmp("rt dev\302\266h", "rt\303\202of") < 0);
|
||||||
|
cl_assert(strcasecmp("et", "e\342\202\254ghi=") < 0);
|
||||||
|
|
||||||
|
cl_assert(git__strcasecmp("rt\303\202of", "rt dev\302\266h") > 0);
|
||||||
|
cl_assert(git__strcasecmp("e\342\202\254ghi=", "et") > 0);
|
||||||
|
cl_assert(git__strcasecmp("rt dev\302\266h", "rt\303\202of") < 0);
|
||||||
|
cl_assert(git__strcasecmp("et", "e\342\202\254ghi=") < 0);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user