lua

A copy of the Lua development repository
Log | Files | Refs | README

commit ef28e5f789f7e7be1a3961d13cb35bbfd2542997
parent ec65ab878e04822f1cbcc3198f19076d57900e9f
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Fri, 21 Jun 2024 16:26:22 -0300

Removed 'int' size limit for string.rep

Diffstat:
Mlstrlib.c | 14++------------
Mtestes/strings.lua | 7+++----
2 files changed, 5 insertions(+), 16 deletions(-)

diff --git 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 @@ -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