Răsfoiți Sursa

Length of external strings must fit in Lua integer

(As the length of any string in Lua.)
Roberto Ierusalimschy 1 an în urmă
părinte
comite
c1dc08e8e8
4 a modificat fișierele cu 9 adăugiri și 4 ștergeri
  1. 1 0
      lapi.c
  2. 5 3
      lauxlib.c
  3. 1 1
      lundump.c
  4. 2 0
      manual/manual.of

+ 1 - 0
lapi.c

@@ -551,6 +551,7 @@ LUA_API const char *lua_pushextlstring (lua_State *L,
 	        const char *s, size_t len, lua_Alloc falloc, void *ud) {
   TString *ts;
   lua_lock(L);
+  api_check(L, len <= MAX_SIZE, "string too large");
   api_check(L, s[len] == '\0', "string not ending with zero");
   ts = luaS_newextlstr (L, s, len, falloc, ud);
   setsvalue2s(L, L->top.p, ts);

+ 5 - 3
lauxlib.c

@@ -538,10 +538,12 @@ static void newbox (lua_State *L) {
 */
 static size_t newbuffsize (luaL_Buffer *B, size_t sz) {
   size_t newsize = (B->size / 2) * 3;  /* buffer size * 1.5 */
-  if (l_unlikely(MAX_SIZET - sz - 1 < B->n))  /* overflow in (B->n + sz + 1)? */
-    return luaL_error(B->L, "buffer too large");
-  if (newsize < B->n + sz + 1)  /* not big enough? */
+  if (l_unlikely(sz > MAX_SIZE - B->n - 1))
+    return luaL_error(B->L, "resulting string too large");
+  if (newsize < B->n + sz + 1 || newsize > MAX_SIZE) {
+    /* newsize was not big enough or too big */
     newsize = B->n + sz + 1;
+  }
   return newsize;
 }
 

+ 1 - 1
lundump.c

@@ -109,7 +109,7 @@ static size_t loadVarint (LoadState *S, size_t limit) {
 
 
 static size_t loadSize (LoadState *S) {
-  return loadVarint(S, MAX_SIZET);
+  return loadVarint(S, MAX_SIZE);
 }
 
 

+ 2 - 0
manual/manual.of

@@ -3942,6 +3942,8 @@ holding the string content,
 and @id{len} is the length of the string.
 The string should have a zero at its end,
 that is, the condition @T{s[len] == '\0'} should hold.
+As with any string in Lua,
+the length must fit in a Lua integer.
 
 If @id{falloc} is different from @id{NULL},
 that function will be called by Lua