mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 16:53:02 +00:00
Fix a couple of buffer overrun bugs.
Use prototypes if the compiler understands them.
This commit is contained in:
160
src/reader.c
160
src/reader.c
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user