From 4019a8014aae283f44aad40d0e5c0334f8c63fd8 Mon Sep 17 00:00:00 2001 From: Emil Renner Berthing Date: Tue, 5 Feb 2013 20:50:30 +0100 Subject: parsers: fix stack overflow --- lem/parsers/core.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lem/parsers/core.c b/lem/parsers/core.c index de60227..0b0bb10 100644 --- a/lem/parsers/core.c +++ b/lem/parsers/core.c @@ -45,19 +45,19 @@ static void parse_target_init(lua_State *T, struct lem_inputbuf *b) { b->u = luaL_checknumber(T, 3); - b->parts = 1; + b->parts = 0; lua_settop(T, 2); } static int parse_target_process(lua_State *T, struct lem_inputbuf *b) { - unsigned int target = b->u; + unsigned long target = b->u; unsigned int size = b->end - b->start; - if (size >= target) { + if ((unsigned long)size >= target) { lua_pushlstring(T, b->buf + b->start, target); - lua_concat(T, b->parts); + lua_concat(T, b->parts + 1); b->start += target; if (b->start == b->end) b->start = b->end = 0; @@ -68,6 +68,10 @@ parse_target_process(lua_State *T, struct lem_inputbuf *b) if (b->end == LEM_INPUTBUF_SIZE) { lua_pushlstring(T, b->buf + b->start, size); b->parts++; + if (b->parts == LUA_MINSTACK-2) { + lua_concat(T, LUA_MINSTACK-2); + b->parts = 1; + } b->start = b->end = 0; b->u = target - size; } @@ -96,8 +100,12 @@ parse_all_process(lua_State *T, struct lem_inputbuf *b) if (b->end == LEM_INPUTBUF_SIZE) { lua_pushlstring(T, b->buf + b->start, LEM_INPUTBUF_SIZE - b->start); - b->start = b->end = 0; b->parts++; + if (b->parts == LUA_MINSTACK-2) { + lua_concat(T, LUA_MINSTACK-2); + b->parts = 1; + } + b->start = b->end = 0; } return LEM_PMORE; @@ -114,8 +122,8 @@ parse_all_destroy(lua_State *T, struct lem_inputbuf *b, enum lem_preason reason) size = b->end - b->start; if (size > 0) { lua_pushlstring(T, b->buf + b->start, size); - b->start = b->end = 0; b->parts++; + b->start = b->end = 0; } lua_concat(T, b->parts); @@ -137,7 +145,7 @@ parse_line_init(lua_State *T, struct lem_inputbuf *b) const char *stopbyte = luaL_optstring(T, 3, "\n"); b->u = (b->start << 8) | stopbyte[0]; - b->parts = 1; + b->parts = 0; lua_settop(T, 2); } @@ -150,7 +158,7 @@ parse_line_process(lua_State *T, struct lem_inputbuf *b) for (i = b->u >> 8; i < b->end; i++) { if (b->buf[i] == stopbyte) { lua_pushlstring(T, b->buf + b->start, i - b->start); - lua_concat(T, b->parts); + lua_concat(T, b->parts + 1); i++; if (i == b->end) b->start = b->end = 0; @@ -163,6 +171,10 @@ parse_line_process(lua_State *T, struct lem_inputbuf *b) if (b->end == LEM_INPUTBUF_SIZE) { lua_pushlstring(T, b->buf + b->start, b->end - b->start); b->parts++; + if (b->parts == LUA_MINSTACK-2) { + lua_concat(T, LUA_MINSTACK-2); + b->parts = 1; + } b->start = b->end = 0; b->u = stopbyte; } else -- cgit v1.2.1