svn commit: r301777 - head/lib/libc/stdio

Andrey Chernov ache at freebsd.org
Fri Jun 10 08:20:17 UTC 2016


Please back it out. __sccl() use plain chars, you can't just call wide
chars __wcollate_range_cmp() from it. Never intermix plain chars and
wide chars without conversion. The problem is somewhere else. The code
used for [a-z] ranges in the format. Moreover, even if conversion added
this code can't work with wchars by definition since uses the same loop
as in regcomp()
for (i = 0; i < 256; i ++)

Counting completely broken regcomp, our locale quickly becomes
intermixing junk of chars and wchars without any conversion. Please
anybody stop hacking here, especially blindly adding wchars everywhere
without analyzing rest of code.
If you see 256 or UCHAR_MAX somewhere, this function can't be converted
to wchars.

On 10.06.2016 8:21, Pedro F. Giffuni wrote:
> Author: pfg
> Date: Fri Jun 10 05:21:52 2016
> New Revision: 301777
> URL: https://svnweb.freebsd.org/changeset/base/301777
> 
> Log:
>   Fix regression from r301461.
>   
>   The fix to the __collate_range_cmp() ABI breakage missed some replacements
>   in libc's vfscanf().  Replace them with __wcollate_range_cmp() which
>   does what is expected.
>   
>   This was breaking applications like xterm and pidgin when using wide
>   characters.
>   
>   Reported by:	Vitalij Satanivskij
>   Approved by:	re
> 
> Modified:
>   head/lib/libc/stdio/vfscanf.c
> 
> Modified: head/lib/libc/stdio/vfscanf.c
> ==============================================================================
> --- head/lib/libc/stdio/vfscanf.c	Fri Jun 10 04:04:55 2016	(r301776)
> +++ head/lib/libc/stdio/vfscanf.c	Fri Jun 10 05:21:52 2016	(r301777)
> @@ -873,7 +873,7 @@ doswitch:
>  			n = *fmt;
>  			if (n == ']'
>  			    || (table->__collate_load_error ? n < c :
> -				__collate_range_cmp (table, n, c) < 0
> +				__wcollate_range_cmp(table, n, c) < 0
>  			       )
>  			   ) {
>  				c = '-';
> @@ -887,8 +887,8 @@ doswitch:
>  				} while (c < n);
>  			} else {
>  				for (i = 0; i < 256; i ++)
> -					if (   __collate_range_cmp (table, c, i) < 0
> -					    && __collate_range_cmp (table, i, n) <= 0
> +					if (__wcollate_range_cmp(table, c, i) < 0 &&
> +					    __wcollate_range_cmp(table, i, n) <= 0
>  					   )
>  						tab[i] = v;
>  			}
> 



More information about the svn-src-head mailing list