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.
This commit is contained in:
parent
e11f3043cd
commit
12eae8c8f3
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=302824
@ -296,8 +296,8 @@ rangematch(const char *pattern, wchar_t test, int flags, char **newp,
|
||||
|
||||
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)
|
||||
|
@ -832,8 +832,8 @@ match(Char *name, Char *pat, Char *patend)
|
||||
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;
|
||||
|
@ -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 *,
|
||||
|
@ -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_collate *table, char c1, char c2)
|
||||
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_collate *table, wchar_t c1, wchar_t c2)
|
||||
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));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -873,7 +873,7 @@ __sccl(char *tab, const u_char *fmt)
|
||||
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 @@ __sccl(char *tab, const u_char *fmt)
|
||||
} 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user