summaryrefslogtreecommitdiffstats
path: root/usr.bin/colldef/parse.y
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-11-28 09:50:24 +0000
committerache <ache@FreeBSD.org>2001-11-28 09:50:24 +0000
commitd415ec9a10e759b54f2c0c24c5b5889a91c4a365 (patch)
treeaaefe61b87021bdb46c286d2659e0f25823480c8 /usr.bin/colldef/parse.y
parent1ab3b395034b90f9494aef83eb785a7f9c6a5cf1 (diff)
downloadFreeBSD-src-d415ec9a10e759b54f2c0c24c5b5889a91c4a365.zip
FreeBSD-src-d415ec9a10e759b54f2c0c24c5b5889a91c4a365.tar.gz
Rewrite buffer handling code a bit to handle large values.
Add more checks for data overflow.
Diffstat (limited to 'usr.bin/colldef/parse.y')
-rw-r--r--usr.bin/colldef/parse.y10
1 files changed, 9 insertions, 1 deletions
diff --git a/usr.bin/colldef/parse.y b/usr.bin/colldef/parse.y
index 2d47cf6..ae7f06e 100644
--- a/usr.bin/colldef/parse.y
+++ b/usr.bin/colldef/parse.y
@@ -61,7 +61,7 @@ char *out_file = "LC_COLLATE";
%}
%union {
u_char ch;
- u_char str[STR_LEN];
+ u_char str[BUFSIZE];
}
%token SUBSTITUTE WITH ORDER RANGE
%token <str> STRING
@@ -90,6 +90,8 @@ substitute : SUBSTITUTE CHAR WITH STRING {
yyerror("NUL character can't be substituted");
if (strchr($4, $2) != NULL)
yyerror("Char 0x%02x substitution is recursive", $2);
+ if (strlen($4) + 1 > STR_LEN)
+ yyerror("Char 0x%02x substitution is too long", $2);
strcpy(__collate_substitute_table[$2], $4);
}
;
@@ -138,6 +140,8 @@ item : CHAR {
| CHAIN {
if (chain_index >= TABLE_SIZE - 1)
yyerror("__collate_chain_pri_table overflow");
+ if (strlen($1) + 1 > STR_LEN)
+ yyerror("Chain %d is too long", chain_index);
strcpy(__collate_chain_pri_table[chain_index].str, $1);
__collate_chain_pri_table[chain_index++].prim = prim_pri++;
}
@@ -188,6 +192,8 @@ prim_sub_item : CHAR {
| CHAIN {
if (chain_index >= TABLE_SIZE - 1)
yyerror("__collate_chain_pri_table overflow");
+ if (strlen($1) + 1 > STR_LEN)
+ yyerror("Chain %d is too long", chain_index);
strcpy(__collate_chain_pri_table[chain_index].str, $1);
__collate_chain_pri_table[chain_index++].prim = prim_pri;
}
@@ -215,6 +221,8 @@ sec_sub_item : CHAR {
| CHAIN {
if (chain_index >= TABLE_SIZE - 1)
yyerror("__collate_chain_pri_table overflow");
+ if (strlen($1) + 1 > STR_LEN)
+ yyerror("Chain %d is too long", chain_index);
strcpy(__collate_chain_pri_table[chain_index].str, $1);
__collate_chain_pri_table[chain_index].prim = prim_pri;
__collate_chain_pri_table[chain_index++].sec = sec_pri++;
OpenPOWER on IntegriCloud