widl: Check for overflow when parsing integer constants.
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 @@
 #include <string.h>
 #include <ctype.h>
 #include <assert.h>
+#include <limits.h>
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -82,6 +83,19 @@
 } 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 @@
 				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}	{