From b5dc2f9b0c57fef5f72152973938ff5265366dcd Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 20 Jul 2015 13:37:12 -0300 Subject: [PATCH] bug: 'io.lines' does not check maximum number of options --- bugs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/bugs b/bugs index 81b9de95..24755610 100644 --- a/bugs +++ b/bugs @@ -3458,6 +3458,41 @@ patch = [[ } +--[=[ +Bug{ +what = [['io.lines' does not check maximum number of options]], +report = [[Patrick Donnell, 2015/07/10]], +since = [[3.0]], +fix = nil, +example = [[ +-- can segfault in some machines +t ={}; for i = 1, 253 do t[i] = 1 end +io.lines("someexistingfile", table.unpack(t))() +]], +patch = [[ +--- liolib.c 2015/07/07 17:03:34 2.146 ++++ liolib.c 2015/07/15 14:40:28 2.147 +@@ -318,8 +318,15 @@ + static int io_readline (lua_State *L); + + ++/* ++** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit ++** in the limit for upvalues of a closure) ++*/ ++#define MAXARGLINE 250 ++ + static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ ++ luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 2); /* move 'n' and 'toclose' to their positions */ +]] +} +]=] + + --[=[ Bug{ what = [[ ]],