From 3f36eb5f9c4635756a38c9327c769599d7b58c1f Mon Sep 17 00:00:00 2001 From: Richard Kettlewell Date: Mon, 11 Jul 2011 20:02:31 +0100 Subject: [PATCH] Config file fixes. * Reject integers in excess of 2^32-1 (rather than reducing them mod 2^32). * ptree_dump(): - Remove a magic number. - More realistic recursion limit. * Various bits of type hygeine. Signed-off-by: Richard Kettlewell --- conffile.c | 8 ++++---- conffile.fl | 21 +++++++++++++++++++-- conffile_internal.h | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/conffile.c b/conffile.c index 53c334b..ede9c49 100644 --- a/conffile.c +++ b/conffile.c @@ -154,7 +154,7 @@ static void ptree_mangle(struct p_node *t) #ifdef DUMP_PARSE_TREE /* Convert a node type to a string, for parse tree dump */ -static string_t ntype(uint32_t type) +static const char *ntype(uint32_t type) { switch(type) { case T_STRING: return "T_STRING"; @@ -179,14 +179,14 @@ static void ptree_indent(int amount) for (i=0; itype<10) { + if (T_IS_PRIMITIVE(n->type)) { switch(n->type) { case T_STRING: printf("T_STRING: \"%s\" (%s line %d)\n", n->data.string,n->loc.file,n->loc.line); break; @@ -197,7 +197,7 @@ static void ptree_dump(struct p_node *n, uint32_t d) default: printf("**unknown primitive type**\n"); break; } } else { - assert(dtype),n->loc.file,n->loc.line); ptree_indent(d); printf(" |-"); ptree_dump(n->l, d+1); diff --git a/conffile.fl b/conffile.fl index 2cfa21b..7228c9e 100644 --- a/conffile.fl +++ b/conffile.fl @@ -29,7 +29,7 @@ do{ \ #define MAX_INCLUDE_DEPTH 10 struct include_stack_item { YY_BUFFER_STATE bst; - uint32_t lineno; + int lineno; cstring_t file; }; struct include_stack_item include_stack[MAX_INCLUDE_DEPTH]; @@ -71,8 +71,25 @@ static struct p_node *stringnode(string_t string) static struct p_node *numnode(string_t number) { struct p_node *r; + unsigned long n; r=leafnode(T_NUMBER); - r->data.number=atoi(number); + errno = 0; + n = strtoul(number, NULL, 10); + /* The caller is expected to only give us [0-9]+, + * so we skip some of the usual syntax checking. */ + r->data.number=n; + /* Give a consistent error message for any kind of + * out-of-range condition */ + if(errno == ERANGE || n != r->data.number) { + Message(M_FATAL,"config file %s line %d: '%s' is too big\n", + config_file, config_lineno, number); + exit(1); + } + if(errno) { + Message(M_FATAL,"config file %s line %d: '%s': %s\n", + config_file, config_lineno, number, strerror(errno)); + exit(1); + } return r; } diff --git a/conffile_internal.h b/conffile_internal.h index 073ab26..44d0ac7 100644 --- a/conffile_internal.h +++ b/conffile_internal.h @@ -23,6 +23,8 @@ typedef cstring_t atom_t; #define T_ALIST 17 #define T_ERROR 20 +#define T_IS_PRIMITIVE(NTYPE) ((NTYPE) < T_ASSIGNMENT) + struct p_node { uint32_t type; struct cloc loc; -- 2.30.2