mirror of git://git.musl-libc.org/musl
fix return value of wcs{,n}cmp for extreme wchar_t values
As a result of using simple subtraction to implement the return values for wcscmp and wcsncmp, integer overflow can occur (producing undefined behavior, and in practice, a wrong comparison result). This does not occur for meaningful character values (21-bit range) but the functions are specified to work on arbitrary wchar_t arrays. This patch replaces the subtraction with a little bit of code that orders the characters correctly, returning -1 if the character from the first string is smaller than the one from the second, 0 if they are equal and 1 if the character from the first string is larger than the one from the second.
This commit is contained in:
parent
35fdfe62a4
commit
07616721f1
|
@ -3,5 +3,5 @@
|
|||
int wcscmp(const wchar_t *l, const wchar_t *r)
|
||||
{
|
||||
for (; *l==*r && *l && *r; l++, r++);
|
||||
return *l - *r;
|
||||
return *l < *r ? -1 : *l > *r;
|
||||
}
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
int wcsncmp(const wchar_t *l, const wchar_t *r, size_t n)
|
||||
{
|
||||
for (; n && *l==*r && *l && *r; n--, l++, r++);
|
||||
return n ? *l - *r : 0;
|
||||
return n ? (*l < *r ? -1 : *l > *r) : 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue