aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/lua/lua_tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/lua/lua_tree.c')
-rw-r--r--plugins/lua/lua_tree.c154
1 files changed, 92 insertions, 62 deletions
diff --git a/plugins/lua/lua_tree.c b/plugins/lua/lua_tree.c
index 98d68ca841..6a9fdb38a7 100644
--- a/plugins/lua/lua_tree.c
+++ b/plugins/lua/lua_tree.c
@@ -27,6 +27,7 @@
*/
#include "packet-lua.h"
+#include <epan/expert.h>
LUA_CLASS_DEFINE(ProtoTree,PROTO_TREE,NOP);
LUA_CLASS_DEFINE(ProtoItem,ITEM,NOP);
@@ -43,10 +44,8 @@ static int ProtoTree_add_item_any(lua_State *L, gboolean little_endian) {
*/
ProtoTree tree = checkProtoTree(L,1);
ProtoField field;
- ProtoItem item;
+ ProtoItem item = NULL;
Tvb tvb;
- int offset;
- int len;
if (!tree) {
pushProtoItem(L,NULL);
@@ -55,71 +54,88 @@ static int ProtoTree_add_item_any(lua_State *L, gboolean little_endian) {
if (( luaL_checkudata (L, 2, TVB) )) {
tvb = checkTvb(L,2);
- const char* str;
+
+ TRY {
+ const char* str;
+ int offset;
+ int len;
+
+ if (lua_isnumber(L,3)) {
+ offset = luaL_checkint(L,3);
+ len = luaL_checkint(L,4);
+ str = lua_tostring(L,5);
+ } else if (lua_isstring(L,3)) {
+ offset = 0;
+ len = 0;
+ str = lua_tostring(L,3);
+ } else {
+ luaL_error(L,"First arg must be either TVB or ProtoField");
+ return 0;
+ }
- if (lua_isnumber(L,3)) {
- offset = luaL_checkint(L,3);
- len = luaL_checkint(L,4);
- str = lua_tostring(L,5);
- } else if (lua_isstring(L,3)) {
- offset = 0;
- len = 0;
- str = lua_tostring(L,3);
- } else {
- luaL_error(L,"First arg must be either TVB or ProtoField");
+ item = proto_tree_add_text(tree,tvb,offset,len,"%s",str);
+ } CATCH(ReportedBoundsError) {
+ proto_tree_add_protocol_format(lua_tree, lua_malformed, lua_tvb, 0, 0, "[Malformed Frame: Packet Length]" );
+ luaL_error(L,"Malformed Frame");
return 0;
- }
-
- item = proto_tree_add_text(tree,tvb,offset,len,"%s",str);
-
+ } ENDTRY;
+
} else if (( luaL_checkudata (L, 2, PROTO_FIELD) )) {
field = checkProtoField(L,2);
tvb = checkTvb(L,3);
- offset = luaL_checkint(L,4);
- len = luaL_checkint(L,5);
-
- if ( lua_gettop(L) == 6 ) {
- switch(field->type) {
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- case FT_FRAMENUM:
- item = proto_tree_add_uint(tree,field->hfid,tvb,offset,len,(guint32)luaL_checknumber(L,6));
- break;
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
- item = proto_tree_add_int(tree,field->hfid,tvb,offset,len,(gint32)luaL_checknumber(L,6));
- break;
- case FT_FLOAT:
- item = proto_tree_add_float(tree,field->hfid,tvb,offset,len,(float)luaL_checknumber(L,6));
- break;
- case FT_DOUBLE:
- item = proto_tree_add_double(tree,field->hfid,tvb,offset,len,(double)luaL_checknumber(L,6));
- break;
- case FT_STRING:
- case FT_STRINGZ:
- item = proto_tree_add_string(tree,field->hfid,tvb,offset,len,luaL_checkstring(L,6));
- break;
- case FT_UINT64:
- case FT_INT64:
- case FT_ETHER:
- case FT_BYTES:
- case FT_UINT_BYTES:
- case FT_IPv4:
- case FT_IPv6:
- case FT_IPXNET:
- case FT_GUID:
- case FT_OID:
- default:
- luaL_error(L,"FT_ not yet supported");
- return 0;
+
+ TRY {
+ int offset = luaL_checkint(L,4);
+ int len = luaL_checkint(L,5);
+
+ if ( lua_gettop(L) == 6 ) {
+ switch(field->type) {
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ case FT_FRAMENUM:
+ item = proto_tree_add_uint(tree,field->hfid,tvb,offset,len,(guint32)luaL_checknumber(L,6));
+ break;
+ case FT_INT8:
+ case FT_INT16:
+ case FT_INT24:
+ case FT_INT32:
+ item = proto_tree_add_int(tree,field->hfid,tvb,offset,len,(gint32)luaL_checknumber(L,6));
+ break;
+ case FT_FLOAT:
+ item = proto_tree_add_float(tree,field->hfid,tvb,offset,len,(float)luaL_checknumber(L,6));
+ break;
+ case FT_DOUBLE:
+ item = proto_tree_add_double(tree,field->hfid,tvb,offset,len,(double)luaL_checknumber(L,6));
+ break;
+ case FT_STRING:
+ case FT_STRINGZ:
+ item = proto_tree_add_string(tree,field->hfid,tvb,offset,len,luaL_checkstring(L,6));
+ break;
+ case FT_UINT64:
+ case FT_INT64:
+ case FT_ETHER:
+ case FT_BYTES:
+ case FT_UINT_BYTES:
+ case FT_IPv4:
+ case FT_IPv6:
+ case FT_IPXNET:
+ case FT_GUID:
+ case FT_OID:
+ default:
+ luaL_error(L,"FT_ not yet supported");
+ return 0;
+ }
+ } else {
+ item = proto_tree_add_item(tree,field->hfid,tvb,offset,len,little_endian);
}
- } else {
- item = proto_tree_add_item(tree,field->hfid,tvb,offset,len,little_endian);
- }
+ } CATCH(ReportedBoundsError) {
+ proto_tree_add_protocol_format(lua_tree, lua_malformed, lua_tvb, 0, 0, "[Malformed Frame: Packet Length]" );
+ luaL_error(L,"Malformed Frame");
+ return 0;
+ } ENDTRY;
+
} else {
luaL_error(L,"First arg must be either TVB or ProtoField");
return 0;
@@ -301,6 +317,19 @@ static int ProtoItem_set_expert_flags(lua_State *L) {
return 0;
}
+static int ProtoItem_add_expert_info(lua_State *L) {
+ ProtoItem item = checkProtoItem(L,1);
+
+ if (item) {
+ int group = str_to_expert(luaL_checkstring(L,2));
+ int severity = str_to_expert(luaL_checkstring(L,3));
+ const gchar* str = luaL_optstring(L,4,"Expert Info");
+
+ expert_add_info_format(lua_pinfo, item, group, severity, "%s", str);
+ }
+
+ return 0;
+}
static int ProtoItem_set_generated(lua_State *L) {
ProtoItem item = checkProtoItem(L,1);
@@ -325,6 +354,7 @@ static const luaL_reg ProtoItem_methods[] = {
{"append_text", ProtoItem_append_text},
{"set_len", ProtoItem_set_len},
{"set_expert_flags", ProtoItem_set_expert_flags},
+ {"add_expert_info", ProtoItem_add_expert_info},
{"set_generated", ProtoItem_set_generated},
{"set_hidden", ProtoItem_set_hidden},
{0, 0}