Module: wine Branch: master Commit: cb3ea6843cad1a28b4e9f1d67a6e539af63ec24a URL: http://source.winehq.org/git/wine.git/?a=commit;h=cb3ea6843cad1a28b4e9f1d67a...
Author: Rob Shearman robertshearman@gmail.com Date: Sat Oct 18 11:50:20 2008 +0100
widl: Check for overflow when parsing integer constants.
---
tools/widl/parser.l | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 6a02f50..15e1fb9 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -47,6 +47,7 @@ double [0-9]+.[0-9]+([eE][+-]?[0-9]+)* #include <string.h> #include <ctype.h> #include <assert.h> +#include <limits.h>
#ifdef HAVE_UNISTD_H #include <unistd.h> @@ -82,6 +83,19 @@ struct { } import_stack[MAX_IMPORT_DEPTH]; int import_stack_ptr = 0;
+/* converts an integer in string form to an unsigned long and prints an error + * on overflow */ +static unsigned long xstrtoul(const char *nptr, char **endptr, int base) +{ + unsigned long l; + + errno = 0; + l = strtoul(nptr, endptr, base); + if (l == ULONG_MAX && errno == ERANGE) + error_loc("integer constant %s is too large\n", nptr); + return l; +} + UUID *parse_uuid(const char *u) { UUID* uuid = xmalloc(sizeof(UUID)); @@ -154,11 +168,11 @@ UUID *parse_uuid(const char *u) return aUUID; } <INITIAL,ATTR>{hex} { - parser_lval.num = strtoul(yytext, NULL, 0); + parser_lval.num = xstrtoul(yytext, NULL, 0); return aHEXNUM; } <INITIAL,ATTR>{int} { - parser_lval.num = strtoul(yytext, NULL, 0); + parser_lval.num = xstrtoul(yytext, NULL, 0); return aNUM; } <INITIAL>{double} {