Fix a couple of buffer overrun bugs.

Use prototypes if the compiler understands them.
This commit is contained in:
Jesse Thilo
1998-12-30 05:21:02 +00:00
parent 7bb4d91420
commit 118fb2053c

View File

@@ -26,7 +26,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
The entry point is reader(). */ The entry point is reader(). */
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
#include "system.h" #include "system.h"
#include "files.h" #include "files.h"
#include "alloc.h" #include "alloc.h"
@@ -52,46 +51,30 @@ extern bucket *symval;
extern int numval; extern int numval;
extern int expected_conflicts; extern int expected_conflicts;
extern char *token_buffer; extern char *token_buffer;
extern int maxtoken;
extern void init_lex(); extern void init_lex PARAMS((void));
extern void tabinit(); extern char *grow_token_buffer PARAMS((char *));
extern void output_headers(); extern void tabinit PARAMS((void));
extern void output_trailers(); extern void output_headers PARAMS((void));
extern void free_symtab(); extern void output_trailers PARAMS((void));
extern void open_extra_files(); extern void free_symtab PARAMS((void));
extern char *int_to_string(); extern void open_extra_files PARAMS((void));
extern void fatal(); extern char *int_to_string PARAMS((int));
extern void fatals(); extern char *printable_version PARAMS((int));
extern void warn(); extern void fatal PARAMS((char *));
extern void warni(); extern void fatals PARAMS((char *, char *));
extern void warns(); extern void warn PARAMS((char *));
extern void warnss(); extern void warni PARAMS((char *, int));
extern void warnsss(); extern void warns PARAMS((char *, char *));
extern void unlex(); extern void warnss PARAMS((char *, char *, char *));
extern void done(); extern void warnsss PARAMS((char *, char *, char *, char *));
extern void unlex PARAMS((int));
extern void done PARAMS((int));
extern int skip_white_space(); extern int skip_white_space PARAMS((void));
extern int parse_percent_token(); extern int parse_percent_token PARAMS((void));
extern int lex(); extern int lex PARAMS((void));
void reader_output_yylsp();
void read_declarations();
void copy_definition();
void parse_token_decl();
void parse_start_decl();
void parse_type_decl();
void parse_assoc_decl();
void parse_union_decl();
void parse_expect_decl();
void parse_thong_decl();
void copy_action();
void readgram();
void record_rule_line();
void packsymbols();
void output_token_defines();
void packgram();
int read_signed_integer();
static int get_type();
typedef typedef
struct symbol_list struct symbol_list
@@ -103,6 +86,29 @@ typedef
symbol_list; symbol_list;
void reader PARAMS((void));
void reader_output_yylsp PARAMS((FILE *));
void read_declarations PARAMS((void));
void copy_definition PARAMS((void));
void parse_token_decl PARAMS((int, int));
void parse_start_decl PARAMS((void));
void parse_type_decl PARAMS((void));
void parse_assoc_decl PARAMS((int));
void parse_union_decl PARAMS((void));
void parse_expect_decl PARAMS((void));
char *get_type_name PARAMS((int, symbol_list *));
void copy_guard PARAMS((symbol_list *, int));
void parse_thong_decl PARAMS((void));
void copy_action PARAMS((symbol_list *, int));
bucket *gensym PARAMS((void));
void readgram PARAMS((void));
void record_rule_line PARAMS((void));
void packsymbols PARAMS((void));
void output_token_defines PARAMS((FILE *));
void packgram PARAMS((void));
int read_signed_integer PARAMS((FILE *));
static int get_type PARAMS((void));
int lineno; int lineno;
symbol_list *grammar; symbol_list *grammar;
@@ -131,8 +137,7 @@ extern char *version_string;
static void static void
skip_to_char(target) skip_to_char (int target)
int target;
{ {
int c; int c;
if (target == '\n') if (target == '\n')
@@ -149,7 +154,7 @@ skip_to_char(target)
void void
reader() reader (void)
{ {
start_flag = 0; start_flag = 0;
startval = NULL; /* start symbol not specified yet. */ startval = NULL; /* start symbol not specified yet. */
@@ -227,8 +232,7 @@ reader()
} }
void void
reader_output_yylsp(f) reader_output_yylsp (FILE *f)
FILE *f;
{ {
if (yylsp_needed) if (yylsp_needed)
fprintf(f, LTYPESTR); fprintf(f, LTYPESTR);
@@ -239,7 +243,7 @@ Handle any % declarations,
and copy the contents of any %{ ... %} groups to fattrs. */ and copy the contents of any %{ ... %} groups to fattrs. */
void void
read_declarations () read_declarations (void)
{ {
register int c; register int c;
register int tok; register int tok;
@@ -336,7 +340,7 @@ read_declarations ()
The %{ has already been read. Return after reading the %}. */ The %{ has already been read. Return after reading the %}. */
void void
copy_definition () copy_definition (void)
{ {
register int c; register int c;
register int match; register int match;
@@ -475,8 +479,7 @@ For %token, what_is is STOKEN and what_is_not is SNTERM.
For %nterm, the arguments are reversed. */ For %nterm, the arguments are reversed. */
void void
parse_token_decl (what_is, what_is_not) parse_token_decl (int what_is, int what_is_not)
int what_is, what_is_not;
{ {
register int token = 0; register int token = 0;
register char *typename = 0; register char *typename = 0;
@@ -569,7 +572,7 @@ parse_token_decl (what_is, what_is_not)
*/ */
void void
parse_thong_decl () parse_thong_decl (void)
{ {
register int token; register int token;
register struct bucket *symbol; register struct bucket *symbol;
@@ -631,7 +634,7 @@ parse_thong_decl ()
/* parse what comes after %start */ /* parse what comes after %start */
void void
parse_start_decl () parse_start_decl (void)
{ {
if (start_flag) if (start_flag)
warn(_("multiple %start declarations")); warn(_("multiple %start declarations"));
@@ -649,7 +652,7 @@ parse_start_decl ()
/* read in a %type declaration and record its information for get_type_name to access */ /* read in a %type declaration and record its information for get_type_name to access */
void void
parse_type_decl () parse_type_decl (void)
{ {
register int k; register int k;
register char *name; register char *name;
@@ -702,8 +705,7 @@ parse_type_decl ()
/* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */ /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */
void void
parse_assoc_decl (assoc) parse_assoc_decl (int assoc)
int assoc;
{ {
register int k; register int k;
register char *name = NULL; register char *name = NULL;
@@ -783,7 +785,7 @@ int assoc;
definition of YYSTYPE, the type of elements of the parser value stack. */ definition of YYSTYPE, the type of elements of the parser value stack. */
void void
parse_union_decl() parse_union_decl (void)
{ {
register int c; register int c;
register int count; register int count;
@@ -897,7 +899,7 @@ parse_union_decl()
shift-reduce conflicts. */ shift-reduce conflicts. */
void void
parse_expect_decl() parse_expect_decl (void)
{ {
register int c; register int c;
register int count; register int count;
@@ -928,9 +930,7 @@ parse_expect_decl()
/* Get the data type (alternative in the union) of the value for symbol n in rule rule. */ /* Get the data type (alternative in the union) of the value for symbol n in rule rule. */
char * char *
get_type_name(n, rule) get_type_name (int n, symbol_list *rule)
int n;
symbol_list *rule;
{ {
static char *msg = N_("invalid $ value"); static char *msg = N_("invalid $ value");
@@ -969,9 +969,7 @@ which says where to find $0 with respect to the top of the stack,
for the simple parser in which the stack is not popped until after the guard is run. */ for the simple parser in which the stack is not popped until after the guard is run. */
void void
copy_guard(rule, stack_offset) copy_guard (symbol_list *rule, int stack_offset)
symbol_list *rule;
int stack_offset;
{ {
register int c; register int c;
register int n; register int n;
@@ -1111,7 +1109,12 @@ int stack_offset;
register char *cp = token_buffer; register char *cp = token_buffer;
while ((c = getc(finput)) != '>' && c > 0) while ((c = getc(finput)) != '>' && c > 0)
*cp++ = c; {
if (cp == token_buffer + maxtoken)
cp = grow_token_buffer(cp);
*cp++ = c;
}
*cp = 0; *cp = 0;
type_name = token_buffer; type_name = token_buffer;
@@ -1202,9 +1205,7 @@ stack_offset is the number of values in the current rule so far,
which says where to find $0 with respect to the top of the stack. */ which says where to find $0 with respect to the top of the stack. */
void void
copy_action(rule, stack_offset) copy_action (symbol_list *rule, int stack_offset)
symbol_list *rule;
int stack_offset;
{ {
register int c; register int c;
register int n; register int n;
@@ -1333,7 +1334,12 @@ int stack_offset;
register char *cp = token_buffer; register char *cp = token_buffer;
while ((c = getc(finput)) != '>' && c > 0) while ((c = getc(finput)) != '>' && c > 0)
*cp++ = c; {
if (cp == token_buffer + maxtoken)
cp = grow_token_buffer(cp);
*cp++ = c;
}
*cp = 0; *cp = 0;
type_name = token_buffer; type_name = token_buffer;
value_components_used = 1; value_components_used = 1;
@@ -1418,7 +1424,7 @@ int stack_offset;
whose name cannot conflict with the user's names. */ whose name cannot conflict with the user's names. */
bucket * bucket *
gensym() gensym (void)
{ {
register bucket *sym; register bucket *sym;
@@ -1439,7 +1445,7 @@ All guards and actions are copied out to the appropriate files,
labelled by the rule number they apply to. */ labelled by the rule number they apply to. */
void void
readgram() readgram (void)
{ {
register int t; register int t;
register bucket *lhs; register bucket *lhs;
@@ -1731,15 +1737,15 @@ readgram()
void void
record_rule_line () record_rule_line (void)
{ {
/* Record each rule's source line number in rline table. */ /* Record each rule's source line number in rline table. */
if (nrules >= rline_allocated) if (nrules >= rline_allocated)
{ {
rline_allocated = nrules * 2; rline_allocated = nrules * 2;
rline = (short *) xrealloc (rline, rline = (short *) xrealloc ((char *) rline,
rline_allocated * sizeof (short)); rline_allocated * sizeof (short));
} }
rline[nrules] = lineno; rline[nrules] = lineno;
} }
@@ -1748,7 +1754,7 @@ record_rule_line ()
/* read in a %type declaration and record its information for get_type_name to access */ /* read in a %type declaration and record its information for get_type_name to access */
/* this is unused. it is only called from the #if 0 part of readgram */ /* this is unused. it is only called from the #if 0 part of readgram */
static int static int
get_type() get_type (void)
{ {
register int k; register int k;
register int t; register int t;
@@ -1798,7 +1804,7 @@ get_type()
Set up vectors tags and sprec of names and precedences of symbols. */ Set up vectors tags and sprec of names and precedences of symbols. */
void void
packsymbols() packsymbols (void)
{ {
register bucket *bp; register bucket *bp;
register int tokno = 1; register int tokno = 1;
@@ -1945,8 +1951,7 @@ packsymbols()
The value is the user token number. The value is the user token number.
*/ */
void void
output_token_defines(file) output_token_defines (FILE *file)
FILE *file;
{ {
bucket *bp; bucket *bp;
register char *cp, *symbol; register char *cp, *symbol;
@@ -1990,7 +1995,7 @@ FILE *file;
/* convert the rules into the representation using rrhs, rlhs and ritems. */ /* convert the rules into the representation using rrhs, rlhs and ritems. */
void void
packgram() packgram (void)
{ {
register int itemno; register int itemno;
register int ruleno; register int ruleno;
@@ -2051,8 +2056,7 @@ packgram()
/* Read a signed integer from STREAM and return its value. */ /* Read a signed integer from STREAM and return its value. */
int int
read_signed_integer (stream) read_signed_integer (FILE *stream)
FILE *stream;
{ {
register int c = getc(stream); register int c = getc(stream);
register int sign = 1; register int sign = 1;