]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Limit number of arguments given to io.lines() and fp:lines().
authorMike Pall <mike>
Fri, 10 Jul 2015 01:42:51 +0000 (03:42 +0200)
committerMike Pall <mike>
Fri, 10 Jul 2015 01:42:51 +0000 (03:42 +0200)
src/lib_io.c

index 037aa28e562c514867dbcb5f1b26e20f6183bd2a..a502dd522af841bd31f653edba0ce18c74a8a0f8 100644 (file)
@@ -278,6 +278,15 @@ static int io_file_iter(lua_State *L)
   return n;
 }
 
+static int io_file_lines(lua_State *L)
+{
+  int n = (int)(L->top - L->base);
+  if (n > LJ_MAX_UPVAL)
+    lj_err_caller(L, LJ_ERR_UNPACK);
+  lua_pushcclosure(L, io_file_iter, n);
+  return 1;
+}
+
 /* -- I/O file methods ---------------------------------------------------- */
 
 #define LJLIB_MODULE_io_method
@@ -361,8 +370,7 @@ LJLIB_CF(io_method_setvbuf)
 LJLIB_CF(io_method_lines)
 {
   io_tofile(L);
-  lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base));
-  return 1;
+  return io_file_lines(L);
 }
 
 LJLIB_CF(io_method___gc)
@@ -492,8 +500,7 @@ LJLIB_CF(io_lines)
   } else {  /* io.lines() iterates over stdin. */
     setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_INPUT));
   }
-  lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base));
-  return 1;
+  return io_file_lines(L);
 }
 
 LJLIB_CF(io_type)