diff options
author | ache <ache@FreeBSD.org> | 2001-11-28 09:50:24 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2001-11-28 09:50:24 +0000 |
commit | d415ec9a10e759b54f2c0c24c5b5889a91c4a365 (patch) | |
tree | aaefe61b87021bdb46c286d2659e0f25823480c8 /usr.bin/colldef/parse.y | |
parent | 1ab3b395034b90f9494aef83eb785a7f9c6a5cf1 (diff) | |
download | FreeBSD-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.y | 10 |
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++; |