59 static int SCLuaUserDataIsTxType(uint32_t type_id)
81 static void SCLuaTxRefStaleRaise(
lua_State *L)
83 luaL_error(L,
"tx no longer valid: the transaction or its flow state was freed");
88 static uint8_t *SCLuaUserDataPayload(
lua_State *L,
int idx,
const char *mt, uint32_t type_id)
90 void *block = luaL_testudata(L, idx, mt);
103 uint8_t *block = (uint8_t *)luaL_checkudata(L, idx, mt);
109 luaL_error(L,
"invalid handle: type mismatch");
115 if (SCLuaUserDataIsTxType(type_id) &&
117 SCLuaTxRefStaleRaise(L);
125 uint8_t *payload = SCLuaUserDataPayload(L, idx, mt, type_id);
126 if (payload == NULL) {
129 if (SCLuaUserDataIsTxType(type_id) &&
131 SCLuaTxRefStaleRaise(L);
139 uint8_t *block = (uint8_t *)luaL_checkudata(L, idx, mt);
145 luaL_error(L,
"invalid handle: type mismatch");
154 if (payload == NULL) {
157 if (SCLuaUserDataIsTxType(type_id) &&
187 if (
f == NULL || ref->
flow == NULL ||
f != ref->
flow) {
220 lua_pushnil(luastate);
221 lua_pushstring(luastate, msg);
228 if (!lua_isstring(luastate, idx))
230 const char *
str = lua_tostring(luastate, idx);
233 if (strlen(
str) == 0)
240 lua_pushstring(luastate, key);
241 lua_pushnumber(luastate, value);
242 lua_settable(luastate, -3);
247 lua_pushstring(luastate, key);
248 lua_pushboolean(luastate, value);
249 lua_settable(luastate, -3);
258 lua_pushstring(luastate, key);
259 lua_pushstring(luastate, value ? value :
"(null)");
260 lua_settable(luastate, -3);
266 lua_State *luastate,
const char *key,
const char *value,
size_t len)
268 lua_pushstring(luastate, key);
269 lua_pushlstring(luastate, value,
len);
270 lua_settable(luastate, -3);
274 lua_State *luastate,
const char *key,
const uint8_t *value,
size_t len)
276 lua_pushstring(luastate, key);
278 lua_settable(luastate, -3);
295 return (alproto == flow->
alproto);
309 static int TestTxHandleWrapper(
lua_State *L)
312 lua_pushboolean(L, r != NULL);
323 memcpy(ud, ref,
sizeof(*ref));
324 luaL_getmetatable(L,
"suricata:dns:tx");
325 lua_setmetatable(L, -2);
333 static Flow *TestMakeFlow(
void)
348 memset(&ref, 0,
sizeof(ref));
367 static int SCLuaTxRefResolveTest(
void)
372 Flow *
f = TestMakeFlow();
374 Flow *f2 = TestMakeFlow();
386 ref = TestMakeRef(
f);
426 static int SCLuaTestUserDataStaleTest(
void)
431 luaL_newmetatable(L,
"suricata:dns:tx");
434 Flow *
f = TestMakeFlow();
441 void *ud = TestNewDnsTxData(L, &ref);
444 int udidx = lua_gettop(L);
445 lua_pushcfunction(L, TestTxHandleWrapper);
446 lua_pushvalue(L, udidx);
447 int rc = lua_pcall(L, 1, 0, 0);
449 const char *err = lua_tostring(L, -1);
451 FAIL_IF_NOT(strstr(err,
"tx no longer valid") != NULL);
464 static int SCLuaTestUserDataLiveTest(
void)
469 luaL_newmetatable(L,
"suricata:dns:tx");
472 Flow *
f = TestMakeFlow();
477 void *ud = TestNewDnsTxData(L, &ref);
481 int udidx = lua_gettop(L);
482 lua_pushcfunction(L, TestTxHandleWrapper);
483 lua_pushvalue(L, udidx);
484 int rc = lua_pcall(L, 1, 1, 0);
490 lua_pushinteger(L, 42);
491 int numidx = lua_gettop(L);
492 lua_pushcfunction(L, TestTxHandleWrapper);
493 lua_pushvalue(L, numidx);
494 rc = lua_pcall(L, 1, 1, 0);
507 UtRegisterTest(
"SCLuaTestUserDataStaleTest", SCLuaTestUserDataStaleTest);
508 UtRegisterTest(
"SCLuaTestUserDataLiveTest", SCLuaTestUserDataLiveTest);