77 static const char luaext_key_ld[] =
"suricata:luadata";
82 #define LUA_ERROR(msg) \
83 LuaCallbackError(luastate, (msg)); \
86 static int GetLuaData(
lua_State *luastate, DetectLuaData **ret_ld)
91 lua_pushlightuserdata(luastate, (
void *)&luaext_key_ld);
92 lua_gettable(luastate, LUA_REGISTRYINDEX);
93 ld = lua_touserdata(luastate, -1);
95 LUA_ERROR(
"internal error: no ld");
103 Flow *f = LuaStateGetFlow(luastate);
105 LUA_ERROR(
"no flow");
112 FlowVar **ret_fv,
bool fv_may_be_null, uint32_t *ret_idx)
114 DetectLuaData *ld = NULL;
120 int ret = GetLuaData(luastate, &ld);
124 if (!lua_isnumber(luastate, 1)) {
125 LUA_ERROR(
"flowvar id not a number");
127 int id = lua_tonumber(luastate, 1);
128 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
129 LUA_ERROR(
"flowvar id out of range");
131 uint32_t idx = ld->flowvar[id];
133 LUA_ERROR(
"flowvar id uninitialized");
136 if (!fv_may_be_null && fv == NULL) {
137 LUA_ERROR(
"no flow var");
149 if (!lua_isstring(luastate, 1)) {
150 LUA_ERROR(
"flowvar key not a string");
152 const char *keystr = lua_tostring(luastate, 1);
153 if (keystr == NULL) {
154 LUA_ERROR(
"key is null");
156 if (!lua_isnumber(luastate, 2)) {
157 LUA_ERROR(
"key length not specified");
159 int keylen = lua_tonumber(luastate, 2);
160 if (keylen < 0 || keylen > 0xff) {
161 LUA_ERROR(
"key len out of range: max 256");
166 LUA_ERROR(
"no flow var");
173 FlowVar **ret_fv,
bool fv_may_be_null, uint32_t *ret_idx)
175 DetectLuaData *ld = NULL;
181 int ret = GetLuaData(luastate, &ld);
185 if (!lua_isnumber(luastate, 1)) {
186 LUA_ERROR(
"flowvar id not a number");
188 int id = lua_tonumber(luastate, 1);
189 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
190 LUA_ERROR(
"flowvar id out of range");
192 uint32_t idx = ld->flowint[id];
194 LUA_ERROR(
"flowvar id uninitialized");
197 if (!fv_may_be_null && fv == NULL) {
198 LUA_ERROR(
"no flow var");
206 static int LuaGetFlowvar(
lua_State *luastate)
213 ret = GetFlow(luastate, &f);
217 if (lua_isnumber(luastate, 1)) {
218 ret = GetFlowVarById(luastate, f, &fv,
false, NULL);
219 if (ret != 0 || fv == NULL)
221 }
else if (lua_isstring(luastate, 1)) {
222 ret = GetFlowVarByKey(luastate, f, &fv);
223 if (ret != 0 || fv == NULL)
226 LUA_ERROR(
"invalid data type as first argument");
229 LuaPushStringBuffer(luastate,
235 static int LuaSetFlowvarById(
lua_State *luastate)
245 int ret = GetFlow(luastate, &f);
249 ret = GetFlowVarById(luastate, f, &fv,
true, &idx);
253 if (!lua_isstring(luastate, 2)) {
254 LUA_ERROR(
"buffer not a string");
256 str = lua_tostring(luastate, 2);
258 LUA_ERROR(
"buffer is null");
261 if (!lua_isnumber(luastate, 3)) {
262 LUA_ERROR(
"buffer length not specified");
264 len = lua_tonumber(luastate, 3);
265 if (len < 0 || len > 0xffff) {
266 LUA_ERROR(
"len out of range: max 64k");
271 LUA_ERROR(
"out of memory");
280 static int LuaSetFlowvarByKey(
lua_State *luastate)
288 int ret = GetFlow(luastate, &f);
292 const char *keystr = NULL;
295 keystr = lua_tostring(luastate, 1);
296 if (keystr == NULL) {
297 LUA_ERROR(
"key is null");
299 if (!lua_isnumber(luastate, 2)) {
300 LUA_ERROR(
"key length not specified");
302 keylen = lua_tonumber(luastate, 2);
303 if (keylen < 0 || keylen > 0xff) {
304 LUA_ERROR(
"key len out of range: max 256");
307 if (!lua_isstring(luastate, 3)) {
308 LUA_ERROR(
"buffer not a string");
310 str = lua_tostring(luastate, 3);
312 LUA_ERROR(
"buffer is null");
315 if (!lua_isnumber(luastate, 4)) {
316 LUA_ERROR(
"buffer length not specified");
318 len = lua_tonumber(luastate, 4);
319 if (len < 0 || len > 0xffff) {
320 LUA_ERROR(
"len out of range: max 64k");
325 LUA_ERROR(
"out of memory");
330 uint8_t *keybuf =
SCMalloc(keylen+1);
333 LUA_ERROR(
"out of memory");
335 memcpy(keybuf, keystr, keylen);
336 keybuf[keylen] =
'\0';
342 static int LuaSetFlowvar(
lua_State *luastate)
344 if (lua_isnumber(luastate, 1)) {
345 return LuaSetFlowvarById(luastate);
347 return LuaSetFlowvarByKey(luastate);
351 static int LuaGetFlowint(
lua_State *luastate)
358 int ret = GetFlow(luastate, &f);
362 ret = GetFlowIntById(luastate, f, &fv,
false, NULL);
369 lua_pushnumber(luastate, (lua_Number)number);
374 static int LuaSetFlowint(
lua_State *luastate)
381 int ret = GetLuaData(luastate, &ld);
386 ret = GetFlow(luastate, &f);
391 if (!lua_isnumber(luastate, 1)) {
392 LUA_ERROR(
"1st arg not a number");
394 int id = lua_tonumber(luastate, 1);
395 if (id < 0 || id >= DETECT_LUAJIT_MAX_FLOWVARS) {
396 LUA_ERROR(
"flowint id out of range");
399 if (!lua_isnumber(luastate, 2)) {
400 LUA_ERROR(
"2nd arg not a number");
402 lua_Number luanumber = lua_tonumber(luastate, 2);
403 if (luanumber < 0 || id > (
double)UINT_MAX) {
404 LUA_ERROR(
"value out of range, "
405 "value must be unsigned 32bit int");
407 uint32_t number = (uint32_t)luanumber;
409 idx = ld->flowint[id];
411 LUA_ERROR(
"flowint id uninitialized");
416 SCLogDebug(
"stored flow:%p idx:%u value:%u", f, idx, number);
420 static int LuaIncrFlowint(
lua_State *luastate)
428 int ret = GetFlow(luastate, &f);
432 ret = GetFlowIntById(luastate, f, &fv,
true, &idx);
440 if (number < UINT_MAX)
446 lua_pushnumber(luastate, (lua_Number)number);
447 SCLogDebug(
"incremented flow:%p idx:%u value:%u", f, idx, number);
452 static int LuaDecrFlowint(
lua_State *luastate)
460 int ret = GetFlow(luastate, &f);
464 ret = GetFlowIntById(luastate, f, &fv,
true, &idx);
478 lua_pushnumber(luastate, (lua_Number)number);
479 SCLogDebug(
"decremented flow:%p idx:%u value:%u", f, idx, number);
484 static int LuaGetByteVar(
lua_State *luastate)
486 DetectLuaData *ld = NULL;
490 return LuaCallbackError(luastate,
"internal error: no ldet_ctx");
492 int ret = GetLuaData(luastate, &ld);
496 if (!lua_isnumber(luastate, 1)) {
497 LUA_ERROR(
"bytevar id not a number");
499 int id = lua_tonumber(luastate, 1);
500 if (id < 0 || id >= DETECT_LUAJIT_MAX_BYTEVARS) {
501 LUA_ERROR(
"bytevar id out of range");
503 uint32_t idx = ld->bytevar[id];
505 lua_pushinteger(luastate, det_ctx->
byte_values[idx]);
510 void LuaExtensionsMatchSetup(
lua_State *lua_state, DetectLuaData *ld,
516 lua_pushlightuserdata(lua_state, (
void *)&luaext_key_ld);
517 lua_pushlightuserdata(lua_state, (
void *)ld);
518 lua_settable(lua_state, LUA_REGISTRYINDEX);
520 LuaStateSetSignature(lua_state, s);
522 LuaStateSetFlow(lua_state, f);
523 LuaStateSetDetCtx(lua_state, det_ctx);
529 LuaStateSetTX(lua_state, txptr);
535 LuaStateSetPacket(lua_state, p);
537 LuaStateSetDirection(lua_state, (
flags & STREAM_TOSERVER));
543 int LuaRegisterExtensions(
lua_State *lua_state)
545 lua_pushcfunction(lua_state, LuaGetFlowvar);
546 lua_setglobal(lua_state,
"ScFlowvarGet");
548 lua_pushcfunction(lua_state, LuaGetFlowvar);
549 lua_setglobal(lua_state,
"SCFlowvarGet");
551 lua_pushcfunction(lua_state, LuaSetFlowvar);
552 lua_setglobal(lua_state,
"ScFlowvarSet");
554 lua_pushcfunction(lua_state, LuaSetFlowvar);
555 lua_setglobal(lua_state,
"SCFlowvarSet");
557 lua_pushcfunction(lua_state, LuaGetFlowint);
558 lua_setglobal(lua_state,
"ScFlowintGet");
560 lua_pushcfunction(lua_state, LuaGetFlowint);
561 lua_setglobal(lua_state,
"SCFlowintGet");
563 lua_pushcfunction(lua_state, LuaSetFlowint);
564 lua_setglobal(lua_state,
"ScFlowintSet");
566 lua_pushcfunction(lua_state, LuaSetFlowint);
567 lua_setglobal(lua_state,
"SCFlowintSet");
569 lua_pushcfunction(lua_state, LuaIncrFlowint);
570 lua_setglobal(lua_state,
"ScFlowintIncr");
572 lua_pushcfunction(lua_state, LuaIncrFlowint);
573 lua_setglobal(lua_state,
"SCFlowintIncr");
575 lua_pushcfunction(lua_state, LuaDecrFlowint);
576 lua_setglobal(lua_state,
"ScFlowintDecr");
578 lua_pushcfunction(lua_state, LuaDecrFlowint);
579 lua_setglobal(lua_state,
"SCFlowintDecr");
581 lua_pushcfunction(lua_state, LuaGetByteVar);
582 lua_setglobal(lua_state,
"SCByteVarGet");
584 LuaRegisterFunctions(lua_state);
585 LuaRegisterHttpFunctions(lua_state);
586 LuaRegisterDnsFunctions(lua_state);
587 LuaRegisterJa3Functions(lua_state);
588 LuaRegisterTlsFunctions(lua_state);
589 LuaRegisterSshFunctions(lua_state);
590 LuaRegisterHasshFunctions(lua_state);
591 LuaRegisterSmtpFunctions(lua_state);
592 LuaRegisterDNP3Functions(lua_state);