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:
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