From 10b0b09555920ad2ac186274348e73ed61cede90 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 20 May 2016 11:07:48 -0300 Subject: [PATCH] do not convert decimal constants with overflow to integers. (Therefore, they will be converted as floats) --- lobject.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lobject.c b/lobject.c index 41a50df1..6c72144a 100644 --- a/lobject.c +++ b/lobject.c @@ -1,5 +1,5 @@ /* -** $Id: lobject.c,v 2.109 2015/12/14 11:53:27 roberto Exp roberto $ +** $Id: lobject.c,v 2.110 2016/05/02 14:00:32 roberto Exp roberto $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ @@ -293,6 +293,9 @@ static const char *l_str2d (const char *s, lua_Number *result) { } +#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10) +#define MAXLASTD cast_int(LUA_MAXINTEGER % 10) + static const char *l_str2int (const char *s, lua_Integer *result) { lua_Unsigned a = 0; int empty = 1; @@ -309,7 +312,10 @@ static const char *l_str2int (const char *s, lua_Integer *result) { } else { /* decimal */ for (; lisdigit(cast_uchar(*s)); s++) { - a = a * 10 + *s - '0'; + int d = *s - '0'; + if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ + return NULL; /* do not accept it (as integer) */ + a = a * 10 + d; empty = 0; } }