Author: ache
Date: Thu Jul 14 09:07:25 2016
New Revision: 302824
URL: https://svnweb.freebsd.org/changeset/base/302824

Log:
  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() only for single bytes locales
  (we can't do it now for other ones). In previous state only first 256
  wchars are considered and all others are just silently dropped from the
  range.

Modified:
  head/lib/libc/gen/fnmatch.c
  head/lib/libc/gen/glob.c
  head/lib/libc/locale/collate.h
  head/lib/libc/locale/collcmp.c
  head/lib/libc/regex/regcomp.c
  head/lib/libc/stdio/vfscanf.c

Modified: head/lib/libc/gen/fnmatch.c
==============================================================================
--- head/lib/libc/gen/fnmatch.c Thu Jul 14 08:40:59 2016        (r302823)
+++ head/lib/libc/gen/fnmatch.c Thu Jul 14 09:07:25 2016        (r302824)
@@ -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: head/lib/libc/gen/glob.c
==============================================================================
--- head/lib/libc/gen/glob.c    Thu Jul 14 08:40:59 2016        (r302823)
+++ head/lib/libc/gen/glob.c    Thu Jul 14 09:07:25 2016        (r302824)
@@ -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: head/lib/libc/locale/collate.h
==============================================================================
--- head/lib/libc/locale/collate.h      Thu Jul 14 08:40:59 2016        
(r302823)
+++ head/lib/libc/locale/collate.h      Thu Jul 14 09:07:25 2016        
(r302824)
@@ -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: head/lib/libc/locale/collcmp.c
==============================================================================
--- head/lib/libc/locale/collcmp.c      Thu Jul 14 08:40:59 2016        
(r302823)
+++ head/lib/libc/locale/collcmp.c      Thu Jul 14 09:07:25 2016        
(r302824)
@@ -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: head/lib/libc/regex/regcomp.c
==============================================================================
--- head/lib/libc/regex/regcomp.c       Thu Jul 14 08:40:59 2016        
(r302823)
+++ head/lib/libc/regex/regcomp.c       Thu Jul 14 09:07:25 2016        
(r302824)
@@ -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: head/lib/libc/stdio/vfscanf.c
==============================================================================
--- head/lib/libc/stdio/vfscanf.c       Thu Jul 14 08:40:59 2016        
(r302823)
+++ head/lib/libc/stdio/vfscanf.c       Thu Jul 14 09:07:25 2016        
(r302824)
@@ -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;
                        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to