]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
output-lua: http alproto check
authorVictor Julien <victor@inliniac.net>
Fri, 21 Mar 2014 21:26:28 +0000 (22:26 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 15 Aug 2014 11:58:26 +0000 (13:58 +0200)
src/output-lua-http.c

index 7b209a3a3a0e682017fe8a1732e0123a8bb38154..2066199775e2cef2ed4c0c9a80a16559c2a0eb24 100644 (file)
 #include "util-lua.h"
 #include "output-lua-common.h"
 
+int LuaStateNeedProto(lua_State *luastate, AppProto alproto)
+{
+    AppProto flow_alproto = 0;
+    int locked = 0;
+    Flow *flow = LuaStateGetFlow(luastate, &locked);
+    if (flow == NULL)
+        return LuaCallbackError(luastate, "internal error: no flow");
+
+    if (locked == LUA_FLOW_NOT_LOCKED_BY_PARENT) {
+        FLOWLOCK_RDLOCK(flow);
+        flow_alproto = flow->alproto;
+        FLOWLOCK_UNLOCK(flow);
+    } else {
+        flow_alproto = flow->alproto;
+    }
+
+    return (alproto == flow_alproto);
+
+}
+
 static int HttpGetRequestUriRaw(lua_State *luastate)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
 
+    if (tx->request_uri == NULL)
+        return LuaCallbackError(luastate, "no request uri");
+
     return LuaReturnStringBuffer(luastate,
             bstr_ptr(tx->request_uri), bstr_len(tx->request_uri));
 }
 
 static int HttpGetRequestUriNormalized(lua_State *luastate)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
@@ -88,6 +117,9 @@ static int HttpGetRequestUriNormalized(lua_State *luastate)
 
 static int HttpGetRequestLine(lua_State *luastate)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
@@ -101,6 +133,9 @@ static int HttpGetRequestLine(lua_State *luastate)
 
 static int HttpGetResponseLine(lua_State *luastate)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
@@ -114,6 +149,9 @@ static int HttpGetResponseLine(lua_State *luastate)
 
 static int HttpGetHeader(lua_State *luastate, int dir)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
@@ -148,6 +186,9 @@ static int HttpGetResponseHeader(lua_State *luastate)
 
 static int HttpGetRawHeaders(lua_State *luastate, int dir)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");
@@ -182,6 +223,9 @@ static int HttpGetRawResponseHeaders(lua_State *luastate)
 
 static int HttpGetHeaders(lua_State *luastate, int dir)
 {
+    if (!(LuaStateNeedProto(luastate, ALPROTO_HTTP)))
+        return LuaCallbackError(luastate, "error: protocol not http");
+
     htp_tx_t *tx = LuaStateGetTX(luastate);
     if (tx == NULL)
         return LuaCallbackError(luastate, "internal error: no tx");