76 static const char luaext_key_ld[] =
"suricata:luadata";
81 #define LUA_ERROR(msg) \
82 LuaCallbackError(luastate, (msg)); \
85 static int GetLuaData(
lua_State *luastate, DetectLuaData **ret_ld)
90 lua_pushlightuserdata(luastate, (
void *)&luaext_key_ld);
91 lua_gettable(luastate, LUA_REGISTRYINDEX);
92 ld = lua_touserdata(luastate, -1);
94 LUA_ERROR(
"internal error: no ld");
102 Flow *f = LuaStateGetFlow(luastate);
104 LUA_ERROR(
"no flow");
111 FlowVar **ret_fv,
bool fv_may_be_null, uint32_t *ret_idx)
113 DetectLuaData *ld = NULL;
119 int ret = GetLuaData(luastate, &ld);
123 if (!lua_isnumber(luastate, 1)) {
124 LUA_ERROR(
"flowvar id not a number");
126 int id = lua_tonumber(luastate, 1);
127 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
128 LUA_ERROR(
"flowvar id out of range");
130 uint32_t idx = ld->flowvar[id];
132 LUA_ERROR(
"flowvar id uninitialized");
135 if (!fv_may_be_null && fv == NULL) {
136 LUA_ERROR(
"no flow var");
148 if (!lua_isstring(luastate, 1)) {
149 LUA_ERROR(
"flowvar key not a string");
151 const char *keystr = lua_tostring(luastate, 1);
152 if (keystr == NULL) {
153 LUA_ERROR(
"key is null");
155 if (!lua_isnumber(luastate, 2)) {
156 LUA_ERROR(
"key length not specified");
158 int keylen = lua_tonumber(luastate, 2);
159 if (keylen < 0 || keylen > 0xff) {
160 LUA_ERROR(
"key len out of range: max 256");
165 LUA_ERROR(
"no flow var");
172 FlowVar **ret_fv,
bool fv_may_be_null, uint32_t *ret_idx)
174 DetectLuaData *ld = NULL;
180 int ret = GetLuaData(luastate, &ld);
184 if (!lua_isnumber(luastate, 1)) {
185 LUA_ERROR(
"flowvar id not a number");
187 int id = lua_tonumber(luastate, 1);
188 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
189 LUA_ERROR(
"flowvar id out of range");
191 uint32_t idx = ld->flowint[id];
193 LUA_ERROR(
"flowvar id uninitialized");
196 if (!fv_may_be_null && fv == NULL) {
197 LUA_ERROR(
"no flow var");
205 static int LuaGetFlowvar(
lua_State *luastate)
212 ret = GetFlow(luastate, &f);
216 if (lua_isnumber(luastate, 1)) {
217 ret = GetFlowVarById(luastate, f, &fv,
false, NULL);
218 if (ret != 0 || fv == NULL)
220 }
else if (lua_isstring(luastate, 1)) {
221 ret = GetFlowVarByKey(luastate, f, &fv);
222 if (ret != 0 || fv == NULL)
225 LUA_ERROR(
"invalid data type as first argument");
228 LuaPushStringBuffer(luastate,
234 static int LuaSetFlowvarById(
lua_State *luastate)
244 int ret = GetFlow(luastate, &f);
248 ret = GetFlowVarById(luastate, f, &fv,
true, &idx);
252 if (!lua_isstring(luastate, 2)) {
253 LUA_ERROR(
"buffer not a string");
255 str = lua_tostring(luastate, 2);
257 LUA_ERROR(
"buffer is null");
260 if (!lua_isnumber(luastate, 3)) {
261 LUA_ERROR(
"buffer length not specified");
263 len = lua_tonumber(luastate, 3);
264 if (len < 0 || len > 0xffff) {
265 LUA_ERROR(
"len out of range: max 64k");
270 LUA_ERROR(
"out of memory");
279 static int LuaSetFlowvarByKey(
lua_State *luastate)
287 int ret = GetFlow(luastate, &f);
291 const char *keystr = NULL;
294 keystr = lua_tostring(luastate, 1);
295 if (keystr == NULL) {
296 LUA_ERROR(
"key is null");
298 if (!lua_isnumber(luastate, 2)) {
299 LUA_ERROR(
"key length not specified");
301 keylen = lua_tonumber(luastate, 2);
302 if (keylen < 0 || keylen > 0xff) {
303 LUA_ERROR(
"key len out of range: max 256");
306 if (!lua_isstring(luastate, 3)) {
307 LUA_ERROR(
"buffer not a string");
309 str = lua_tostring(luastate, 3);
311 LUA_ERROR(
"buffer is null");
314 if (!lua_isnumber(luastate, 4)) {
315 LUA_ERROR(
"buffer length not specified");
317 len = lua_tonumber(luastate, 4);
318 if (len < 0 || len > 0xffff) {
319 LUA_ERROR(
"len out of range: max 64k");
324 LUA_ERROR(
"out of memory");
329 uint8_t *keybuf =
SCMalloc(keylen+1);
332 LUA_ERROR(
"out of memory");
334 memcpy(keybuf, keystr, keylen);
335 keybuf[keylen] =
'\0';
341 static int LuaSetFlowvar(
lua_State *luastate)
343 if (lua_isnumber(luastate, 1)) {
344 return LuaSetFlowvarById(luastate);
346 return LuaSetFlowvarByKey(luastate);
350 static int LuaGetFlowint(
lua_State *luastate)
357 int ret = GetFlow(luastate, &f);
361 ret = GetFlowIntById(luastate, f, &fv,
false, NULL);
368 lua_pushnumber(luastate, (lua_Number)number);
373 static int LuaSetFlowint(
lua_State *luastate)
380 int ret = GetLuaData(luastate, &ld);
385 ret = GetFlow(luastate, &f);
390 if (!lua_isnumber(luastate, 1)) {
391 LUA_ERROR(
"1st arg not a number");
393 int id = lua_tonumber(luastate, 1);
394 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
395 LUA_ERROR(
"flowint id out of range");
398 if (!lua_isnumber(luastate, 2)) {
399 LUA_ERROR(
"2nd arg not a number");
401 lua_Number luanumber = lua_tonumber(luastate, 2);
402 if (luanumber < 0 || id > (
double)UINT_MAX) {
403 LUA_ERROR(
"value out of range, "
404 "value must be unsigned 32bit int");
406 uint32_t number = (uint32_t)luanumber;
408 idx = ld->flowint[id];
410 LUA_ERROR(
"flowint id uninitialized");
415 SCLogDebug(
"stored flow:%p idx:%u value:%u", f, idx, number);
419 static int LuaIncrFlowint(
lua_State *luastate)
427 int ret = GetFlow(luastate, &f);
431 ret = GetFlowIntById(luastate, f, &fv,
true, &idx);
439 if (number < UINT_MAX)
445 lua_pushnumber(luastate, (lua_Number)number);
446 SCLogDebug(
"incremented flow:%p idx:%u value:%u", f, idx, number);
451 static int LuaDecrFlowint(
lua_State *luastate)
459 int ret = GetFlow(luastate, &f);
463 ret = GetFlowIntById(luastate, f, &fv,
true, &idx);
477 lua_pushnumber(luastate, (lua_Number)number);
478 SCLogDebug(
"decremented flow:%p idx:%u value:%u", f, idx, number);
483 static int LuaGetByteVar(
lua_State *luastate)
485 DetectLuaData *ld = NULL;
489 return LuaCallbackError(luastate,
"internal error: no ldet_ctx");
491 int ret = GetLuaData(luastate, &ld);
495 if (!lua_isnumber(luastate, 1)) {
496 LUA_ERROR(
"bytevar id not a number");
498 int id = lua_tonumber(luastate, 1);
499 if (id < 0 || id >= DETECT_LUAJIT_MAX_BYTEVARS) {
500 LUA_ERROR(
"bytevar id out of range");
502 uint32_t idx = ld->bytevar[id];
504 lua_pushinteger(luastate, det_ctx->
byte_values[idx]);
509 void LuaExtensionsMatchSetup(
lua_State *lua_state, DetectLuaData *ld,
515 lua_pushlightuserdata(lua_state, (
void *)&luaext_key_ld);
516 lua_pushlightuserdata(lua_state, (
void *)ld);
517 lua_settable(lua_state, LUA_REGISTRYINDEX);
519 LuaStateSetSignature(lua_state, s);
521 LuaStateSetFlow(lua_state, f);
522 LuaStateSetDetCtx(lua_state, det_ctx);
528 LuaStateSetTX(lua_state, txptr, det_ctx->
tx_id);
534 LuaStateSetPacket(lua_state, p);
536 LuaStateSetDirection(lua_state, (
flags & STREAM_TOSERVER));
542 int LuaRegisterExtensions(
lua_State *lua_state)
544 lua_pushcfunction(lua_state, LuaGetFlowvar);
545 lua_setglobal(lua_state,
"ScFlowvarGet");
547 lua_pushcfunction(lua_state, LuaGetFlowvar);
548 lua_setglobal(lua_state,
"SCFlowvarGet");
550 lua_pushcfunction(lua_state, LuaSetFlowvar);
551 lua_setglobal(lua_state,
"ScFlowvarSet");
553 lua_pushcfunction(lua_state, LuaSetFlowvar);
554 lua_setglobal(lua_state,
"SCFlowvarSet");
556 lua_pushcfunction(lua_state, LuaGetFlowint);
557 lua_setglobal(lua_state,
"ScFlowintGet");
559 lua_pushcfunction(lua_state, LuaGetFlowint);
560 lua_setglobal(lua_state,
"SCFlowintGet");
562 lua_pushcfunction(lua_state, LuaSetFlowint);
563 lua_setglobal(lua_state,
"ScFlowintSet");
565 lua_pushcfunction(lua_state, LuaSetFlowint);
566 lua_setglobal(lua_state,
"SCFlowintSet");
568 lua_pushcfunction(lua_state, LuaIncrFlowint);
569 lua_setglobal(lua_state,
"ScFlowintIncr");
571 lua_pushcfunction(lua_state, LuaIncrFlowint);
572 lua_setglobal(lua_state,
"SCFlowintIncr");
574 lua_pushcfunction(lua_state, LuaDecrFlowint);
575 lua_setglobal(lua_state,
"ScFlowintDecr");
577 lua_pushcfunction(lua_state, LuaDecrFlowint);
578 lua_setglobal(lua_state,
"SCFlowintDecr");
580 lua_pushcfunction(lua_state, LuaGetByteVar);
581 lua_setglobal(lua_state,
"SCByteVarGet");
583 LuaRegisterFunctions(lua_state);
584 LuaRegisterHttpFunctions(lua_state);
585 LuaRegisterDnsFunctions(lua_state);
586 LuaRegisterJa3Functions(lua_state);
587 LuaRegisterTlsFunctions(lua_state);
588 LuaRegisterSshFunctions(lua_state);
589 LuaRegisterHasshFunctions(lua_state);
590 LuaRegisterSmtpFunctions(lua_state);
591 LuaRegisterDNP3Functions(lua_state);