From adfe17280becb8f7f21958b329f054c2c2a9e733 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Fri, 1 Aug 2014 15:34:37 +0200 Subject: [PATCH] lua: use LuaPushStringBuffer in more places Replace existing workarounds with LuaPushStringBuffer --- src/detect-luajit-extensions.c | 18 ++---------------- src/detect-luajit.c | 19 +++++-------------- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/src/detect-luajit-extensions.c b/src/detect-luajit-extensions.c index 0b9894f597..ece55ac6e5 100644 --- a/src/detect-luajit-extensions.c +++ b/src/detect-luajit-extensions.c @@ -126,26 +126,12 @@ static int LuajitGetFlowvar(lua_State *luastate) return 2; } - //SCLogInfo("returning:"); - //PrintRawDataFp(stdout,fv->data.fv_str.value,fv->data.fv_str.value_len); - - /* we're using a buffer sized at a multiple of 4 as lua_pushlstring generates - * invalid read errors in valgrind otherwise. Adding in a nul to be sure. - * - * Buffer size = len + 1 (for nul) + whatever makes it a multiple of 4 */ - size_t reallen = fv->data.fv_str.value_len; - size_t buflen = fv->data.fv_str.value_len + 1 + ((fv->data.fv_str.value_len + 1) % 4); - uint8_t buf[buflen]; - memset(buf, 0x00, buflen); - memcpy(buf, fv->data.fv_str.value, fv->data.fv_str.value_len); - buf[fv->data.fv_str.value_len] = '\0'; + LuaPushStringBuffer(luastate, (const uint8_t *)fv->data.fv_str.value, + (size_t)fv->data.fv_str.value_len); if (flow_lock == LUA_FLOW_NOT_LOCKED_BY_PARENT) FLOWLOCK_UNLOCK(f); - /* return value through luastate, as a luastring */ - lua_pushlstring(luastate, (char *)buf, reallen); - return 1; } diff --git a/src/detect-luajit.c b/src/detect-luajit.c index c634a86b19..16647067a6 100644 --- a/src/detect-luajit.c +++ b/src/detect-luajit.c @@ -299,16 +299,7 @@ int DetectLuajitMatchBuffer(DetectEngineThreadCtx *det_ctx, Signature *s, SigMat lua_settable(tluajit->luastate, -3); lua_pushstring (tluajit->luastate, luajit->buffername); /* stack at -2 */ - if (buffer_len % 4) { - size_t tmpbuflen = buffer_len + (buffer_len % 4); - uint8_t tmpbuf[tmpbuflen]; - memset(tmpbuf, 0x00, tmpbuflen); - memcpy(tmpbuf, buffer, buffer_len); - tmpbuf[buffer_len] = '\0'; - lua_pushlstring (tluajit->luastate, (const char *)tmpbuf, (size_t)buffer_len); - } else { - lua_pushlstring (tluajit->luastate, (const char *)buffer, (size_t)buffer_len); - } + LuaPushStringBuffer(tluajit->luastate, (const uint8_t *)buffer, (size_t)buffer_len); lua_settable(tluajit->luastate, -3); int retval = lua_pcall(tluajit->luastate, 1, 1, 0); @@ -421,12 +412,12 @@ static int DetectLuajitMatch (ThreadVars *tv, DetectEngineThreadCtx *det_ctx, if ((tluajit->flags & DATATYPE_PAYLOAD) && p->payload_len) { lua_pushliteral(tluajit->luastate, "payload"); /* stack at -2 */ - lua_pushlstring (tluajit->luastate, (const char *)p->payload, (size_t)p->payload_len); /* stack at -3 */ + LuaPushStringBuffer (tluajit->luastate, (const uint8_t *)p->payload, (size_t)p->payload_len); /* stack at -3 */ lua_settable(tluajit->luastate, -3); } if ((tluajit->flags & DATATYPE_PACKET) && GET_PKT_LEN(p)) { lua_pushliteral(tluajit->luastate, "packet"); /* stack at -2 */ - lua_pushlstring (tluajit->luastate, (const char *)GET_PKT_DATA(p), (size_t)GET_PKT_LEN(p)); /* stack at -3 */ + LuaPushStringBuffer (tluajit->luastate, (const uint8_t *)GET_PKT_DATA(p), (size_t)GET_PKT_LEN(p)); /* stack at -3 */ lua_settable(tluajit->luastate, -3); } if (tluajit->alproto == ALPROTO_HTTP) { @@ -445,8 +436,8 @@ static int DetectLuajitMatch (ThreadVars *tv, DetectEngineThreadCtx *det_ctx, if ((tluajit->flags & DATATYPE_HTTP_REQUEST_LINE) && tx->request_line != NULL && bstr_len(tx->request_line) > 0) { lua_pushliteral(tluajit->luastate, "http.request_line"); /* stack at -2 */ - lua_pushlstring (tluajit->luastate, - (const char *)bstr_ptr(tx->request_line), + LuaPushStringBuffer(tluajit->luastate, + (const uint8_t *)bstr_ptr(tx->request_line), bstr_len(tx->request_line)); lua_settable(tluajit->luastate, -3); }