Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Aug 2016 08:51:47 +0000 (UTC)
From:      "Andrey A. Chernov" <ache@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r304275 - in stable/11/lib/libc: gen locale regex stdio
Message-ID:  <201608170851.u7H8plGM041020@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ache
Date: Wed Aug 17 08:51:47 2016
New Revision: 304275
URL: https://svnweb.freebsd.org/changeset/base/304275

Log:
  MFC r302824
  
  1) Eliminate possibility to call __*collate_range_cmp() with inclomplete
  locale (which cause core dump) by removing whole 'table' argument
  by which it passed.
  
  2) Restore __collate_range_cmp() in __sccl().
  
  3) Collating [a-z] range in regcomp() work only for single bytes locales
  (we can't do it now for other ones). In previous code only first 256
  wchars are considered and all others are just silently dropped from the
  range.

Modified:
  stable/11/lib/libc/gen/fnmatch.c
  stable/11/lib/libc/gen/glob.c
  stable/11/lib/libc/locale/collate.h
  stable/11/lib/libc/locale/collcmp.c
  stable/11/lib/libc/regex/regcomp.c
  stable/11/lib/libc/stdio/vfscanf.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/libc/gen/fnmatch.c
==============================================================================
--- stable/11/lib/libc/gen/fnmatch.c	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/gen/fnmatch.c	Wed Aug 17 08:51:47 2016	(r304275)
@@ -296,8 +296,8 @@ rangematch(const char *pattern, wchar_t 
 
 			if (table->__collate_load_error ?
 			    c <= test && test <= c2 :
-			       __wcollate_range_cmp(table, c, test) <= 0
-			    && __wcollate_range_cmp(table, test, c2) <= 0
+			       __wcollate_range_cmp(c, test) <= 0
+			    && __wcollate_range_cmp(test, c2) <= 0
 			   )
 				ok = 1;
 		} else if (c == test)

Modified: stable/11/lib/libc/gen/glob.c
==============================================================================
--- stable/11/lib/libc/gen/glob.c	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/gen/glob.c	Wed Aug 17 08:51:47 2016	(r304275)
@@ -832,8 +832,8 @@ match(Char *name, Char *pat, Char *paten
 				if ((*pat & M_MASK) == M_RNG) {
 					if (table->__collate_load_error ?
 					    CHAR(c) <= CHAR(k) && CHAR(k) <= CHAR(pat[1]) :
-					       __wcollate_range_cmp(table, CHAR(c), CHAR(k)) <= 0
-					    && __wcollate_range_cmp(table, CHAR(k), CHAR(pat[1])) <= 0
+					       __wcollate_range_cmp(CHAR(c), CHAR(k)) <= 0
+					    && __wcollate_range_cmp(CHAR(k), CHAR(pat[1])) <= 0
 					   )
 						ok = 1;
 					pat += 2;

Modified: stable/11/lib/libc/locale/collate.h
==============================================================================
--- stable/11/lib/libc/locale/collate.h	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/locale/collate.h	Wed Aug 17 08:51:47 2016	(r304275)
@@ -128,8 +128,8 @@ int	__collate_load_tables(const char *);
 int	__collate_equiv_value(locale_t, const wchar_t *, size_t);
 void	_collate_lookup(struct xlocale_collate *,const wchar_t *, int *, int *,
 	int, const int **);
-int	__collate_range_cmp(struct xlocale_collate *, char, char);
-int	__wcollate_range_cmp(struct xlocale_collate *, wchar_t, wchar_t);
+int	__collate_range_cmp(char, char);
+int	__wcollate_range_cmp(wchar_t, wchar_t);
 size_t	_collate_wxfrm(struct xlocale_collate *, const wchar_t *, wchar_t *,
 	size_t);
 size_t	_collate_sxfrm(struct xlocale_collate *, const wchar_t *, char *,

Modified: stable/11/lib/libc/locale/collcmp.c
==============================================================================
--- stable/11/lib/libc/locale/collcmp.c	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/locale/collcmp.c	Wed Aug 17 08:51:47 2016	(r304275)
@@ -34,14 +34,13 @@ __FBSDID("$FreeBSD$");
 
 #include <string.h>
 #include <wchar.h>
-#include <xlocale.h>
 #include "collate.h"
 
 /*
  * Compare two characters using collate
  */
 
-int __collate_range_cmp(struct xlocale_collate *table, char c1, char c2)
+int __collate_range_cmp(char c1, char c2)
 {
 	char s1[2], s2[2];
 
@@ -49,12 +48,10 @@ int __collate_range_cmp(struct xlocale_c
 	s1[1] = '\0';
 	s2[0] = c2;
 	s2[1] = '\0';
-	struct _xlocale l = {{0}};
-	l.components[XLC_COLLATE] = (struct xlocale_component *)table;
-	return (strcoll_l(s1, s2, &l));
+	return (strcoll(s1, s2));
 }
 
-int __wcollate_range_cmp(struct xlocale_collate *table, wchar_t c1, wchar_t c2)
+int __wcollate_range_cmp(wchar_t c1, wchar_t c2)
 {
 	wchar_t s1[2], s2[2];
 
@@ -62,7 +59,5 @@ int __wcollate_range_cmp(struct xlocale_
 	s1[1] = L'\0';
 	s2[0] = c2;
 	s2[1] = L'\0';
-	struct _xlocale l = {{0}};
-	l.components[XLC_COLLATE] = (struct xlocale_component *)table;
-	return (wcscoll_l(s1, s2, &l));
+	return (wcscoll(s1, s2));
 }

Modified: stable/11/lib/libc/regex/regcomp.c
==============================================================================
--- stable/11/lib/libc/regex/regcomp.c	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/regex/regcomp.c	Wed Aug 17 08:51:47 2016	(r304275)
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
 #include <limits.h>
 #include <stdlib.h>
 #include <regex.h>
-#include <runetype.h>
 #include <wchar.h>
 #include <wctype.h>
 
@@ -817,14 +816,14 @@ p_b_term(struct parse *p, cset *cs)
 		if (start == finish)
 			CHadd(p, cs, start);
 		else {
-			if (table->__collate_load_error) {
-				(void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE);
+			if (table->__collate_load_error || MB_CUR_MAX > 1) {
+				(void)REQUIRE(start <= finish, REG_ERANGE);
 				CHaddrange(p, cs, start, finish);
 			} else {
-				(void)REQUIRE(__wcollate_range_cmp(table, start, finish) <= 0, REG_ERANGE);
+				(void)REQUIRE(__wcollate_range_cmp(start, finish) <= 0, REG_ERANGE);
 				for (i = 0; i <= UCHAR_MAX; i++) {
-					if (   __wcollate_range_cmp(table, start, i) <= 0
-					    && __wcollate_range_cmp(table, i, finish) <= 0
+					if (   __wcollate_range_cmp(start, i) <= 0
+					    && __wcollate_range_cmp(i, finish) <= 0
 					   )
 						CHadd(p, cs, i);
 				}

Modified: stable/11/lib/libc/stdio/vfscanf.c
==============================================================================
--- stable/11/lib/libc/stdio/vfscanf.c	Wed Aug 17 08:51:41 2016	(r304274)
+++ stable/11/lib/libc/stdio/vfscanf.c	Wed Aug 17 08:51:47 2016	(r304275)
@@ -873,7 +873,7 @@ doswitch:
 			n = *fmt;
 			if (n == ']'
 			    || (table->__collate_load_error ? n < c :
-				__wcollate_range_cmp(table, n, c) < 0
+				__collate_range_cmp(n, c) < 0
 			       )
 			   ) {
 				c = '-';
@@ -887,8 +887,8 @@ doswitch:
 				} while (c < n);
 			} else {
 				for (i = 0; i < 256; i ++)
-					if (__wcollate_range_cmp(table, c, i) < 0 &&
-					    __wcollate_range_cmp(table, i, n) <= 0
+					if (__collate_range_cmp(c, i) <= 0 &&
+					    __collate_range_cmp(i, n) <= 0
 					   )
 						tab[i] = v;
 			}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608170851.u7H8plGM041020>