diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-24 12:03:59 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-24 12:03:59 -0300 |
commit | c1dc08e8e8e22af9902a6341b4a9a9a7811954cc (patch) | |
tree | 7ce5d6c721bd306f83555d821d6372651e3ab223 /lauxlib.c | |
parent | 0f7025dcae08e35a31866234d8d757ab54392190 (diff) | |
download | lua-c1dc08e8e8e22af9902a6341b4a9a9a7811954cc.tar.gz lua-c1dc08e8e8e22af9902a6341b4a9a9a7811954cc.tar.bz2 lua-c1dc08e8e8e22af9902a6341b4a9a9a7811954cc.zip |
Length of external strings must fit in Lua integer
(As the length of any string in Lua.)
Diffstat (limited to 'lauxlib.c')
-rw-r--r-- | lauxlib.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -538,10 +538,12 @@ static void newbox (lua_State *L) { | |||
538 | */ | 538 | */ |
539 | static size_t newbuffsize (luaL_Buffer *B, size_t sz) { | 539 | static size_t newbuffsize (luaL_Buffer *B, size_t sz) { |
540 | size_t newsize = (B->size / 2) * 3; /* buffer size * 1.5 */ | 540 | size_t newsize = (B->size / 2) * 3; /* buffer size * 1.5 */ |
541 | if (l_unlikely(MAX_SIZET - sz - 1 < B->n)) /* overflow in (B->n + sz + 1)? */ | 541 | if (l_unlikely(sz > MAX_SIZE - B->n - 1)) |
542 | return luaL_error(B->L, "buffer too large"); | 542 | return luaL_error(B->L, "resulting string too large"); |
543 | if (newsize < B->n + sz + 1) /* not big enough? */ | 543 | if (newsize < B->n + sz + 1 || newsize > MAX_SIZE) { |
544 | /* newsize was not big enough or too big */ | ||
544 | newsize = B->n + sz + 1; | 545 | newsize = B->n + sz + 1; |
546 | } | ||
545 | return newsize; | 547 | return newsize; |
546 | } | 548 | } |
547 | 549 | ||