diff --git a/lstrlib.c b/lstrlib.c index eb38b67d..8d6573a6 100644 --- a/lstrlib.c +++ b/lstrlib.c @@ -37,16 +37,6 @@ #endif -/* -** Some sizes are better limited to fit in 'int', but must also fit in -** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) -*/ -#define MAXSIZE \ - (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) - - - - static int str_len (lua_State *L) { size_t l; luaL_checklstring(L, 1, &l); @@ -149,10 +139,10 @@ static int str_rep (lua_State *L) { const char *sep = luaL_optlstring(L, 3, "", &lsep); if (n <= 0) lua_pushliteral(L, ""); - else if (l_unlikely(l + lsep < l || l + lsep > MAXSIZE / n)) + else if (l_unlikely(l + lsep < l || l + lsep > MAX_SIZE / n)) return luaL_error(L, "resulting string too large"); else { - size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + size_t totallen = ((size_t)n * (l + lsep)) - lsep; luaL_Buffer b; char *p = luaL_buffinitsize(L, &b, totallen); while (n-- > 1) { /* first n-1 copies (followed by separator) */ diff --git a/testes/strings.lua b/testes/strings.lua index c124b369..a0204309 100644 --- a/testes/strings.lua +++ b/testes/strings.lua @@ -109,10 +109,9 @@ assert(string.rep('teste', 0) == '') assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê') assert(string.rep('', 10) == '') -if string.packsize("i") == 4 then - -- result length would be 2^31 (int overflow) - checkerror("too large", string.rep, 'aa', (1 << 30)) - checkerror("too large", string.rep, 'a', (1 << 30), ',') +do + checkerror("too large", string.rep, 'aa', math.maxinteger); + checkerror("too large", string.rep, 'a', math.maxinteger/2, ',') end -- repetitions with separator