summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Renner Berthing <esmil@mailme.dk>2013-02-05 20:50:30 +0100
committerEmil Renner Berthing <esmil@mailme.dk>2013-02-06 09:33:18 +0100
commit4019a8014aae283f44aad40d0e5c0334f8c63fd8 (patch)
treebd6c6b4065c8a2043c775a31b6ec13dbc813b3af
parent0b0c4006ace26c3d26a666cb012c25e844ed380c (diff)
downloadlem-4019a8014aae283f44aad40d0e5c0334f8c63fd8.tar.gz
lem-4019a8014aae283f44aad40d0e5c0334f8c63fd8.tar.xz
lem-4019a8014aae283f44aad40d0e5c0334f8c63fd8.zip
parsers: fix stack overflow
-rw-r--r--lem/parsers/core.c28
1 files 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