fix return value of wcs{,n}cmp for extreme wchar_t values
authorGabriel Ravier <gabravier@gmail.com>
Wed, 4 Jan 2023 15:07:19 +0000 (16:07 +0100)
committerRich Felker <dalias@aerifal.cx>
Sun, 12 Feb 2023 22:50:59 +0000 (17:50 -0500)
commit07616721f1fa6cb215ffbef23441cae80412484f
tree58c92a1039672246f43cc776bbbf5d93ad561169
parent35fdfe62a4ff471074ca53b7626ec80e83d244bd
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.
src/string/wcscmp.c
src/string/wcsncmp.c