bug in strcasecmp and strncasecmp

Corinna Vinschen corinna-cygwin@cygwin.com
Mon Feb 17 10:00:29 GMT 2025


Hi Bruno,

On Feb 16 17:18, Bruno Haible via Cygwin wrote:
> Per POSIX [1], the functions strcasecmp and strncasecmp should
> "use the current locale to determine the case of the characters.".
> 
> [1] https://pubs.opengroup.org/onlinepubs/9799919799/functions/strcasecmp.html
> 
> This is not what Cygwin does: In the fr_FR.ISO8859-1 locale, the
> characters 0xE9 and 0xC9 are the same modulo case, but strcasecmp
> and strncasecmp consider these characters to be different.

Thanks for your report.

This is a longstanding problem in newlib.  All four strcasecmp functions
call tolower on a char without casting them to unsigned.  So tolower is
called with negativ values if the char is not in the ASCII range.

Adding a cast fixes that and I just pushed a matching patch.

I'm just not sure if that's sufficient in the light of POSIX.1-2024.
The above expression seems to indicate that strcasecmp and friends are
now expected to work on multibyte codesets like UTF-8.

I checked the glibc sources and they still do the bytewise tolower twist
as well, though...


Thanks,
Corinna


More information about the Cygwin mailing list