aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/lua
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2006-02-15 02:00:18 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2006-02-15 02:00:18 +0000
commit2d7b55d80861a0af2b9a21cb4d039045c02d0a1a (patch)
tree8c3bddb905dcea345b1be3cd7ccba08f276de353 /plugins/lua
parent86ea89f2aa52f4db6bbfa814ea19b83041c3fc26 (diff)
- protect proto_items and proto_trees from being used out of their scope
- fix the severity variables svn path=/trunk/; revision=17306
Diffstat (limited to 'plugins/lua')
-rw-r--r--plugins/lua/lua_tree.c28
-rw-r--r--plugins/lua/packet-lua.h1
2 files changed, 22 insertions, 7 deletions
diff --git a/plugins/lua/lua_tree.c b/plugins/lua/lua_tree.c
index 3841dc5edd..36a403e0c5 100644
--- a/plugins/lua/lua_tree.c
+++ b/plugins/lua/lua_tree.c
@@ -33,6 +33,17 @@ LUA_CLASS_DEFINE(ProtoTree,PROTO_TREE,NOP)
LUA_CLASS_DEFINE(ProtoItem,ITEM,NOP)
LUA_CLASS_DEFINE(SubTree,SUBTREE,NOP)
+static GPtrArray* outstanding_stuff = NULL;
+
+#define PUSH_PROTOITEM(L,i) g_ptr_array_add(outstanding_stuff,pushProtoItem(L,i))
+#define PUSH_PROTOTREE(L,t) g_ptr_array_add(outstanding_stuff,pushProtoTree(L,t))
+
+void clear_outstanding_trees(void) {
+ while (outstanding_stuff->len) {
+ void** p = (void**)g_ptr_array_remove_index_fast(outstanding_stuff,0);
+ *p = NULL;
+ }
+}
/*
* SubTree class
@@ -126,8 +137,6 @@ static int ProtoTree_add_item_any(lua_State *L, gboolean little_endian) {
return 1;
}
- if (!tree) return 0;
-
if (! ( field = shiftProtoField(L,1) ) ) {
if (( proto = shiftProto(L,1) )) {
hfid = proto->hfid;
@@ -233,7 +242,7 @@ static int ProtoTree_add_item_any(lua_State *L, gboolean little_endian) {
}
- pushProtoItem(L,item);
+ PUSH_PROTOITEM(L,item);
return 1;
}
@@ -257,7 +266,7 @@ static int ProtoTree_get_parent(lua_State *L) {
item = proto_tree_get_parent(tree);
}
- pushProtoItem(L,item);
+ PUSH_PROTOITEM(L,item);
return 1;
}
@@ -298,19 +307,22 @@ static int ProtoItem_tostring(lua_State *L) {
static int ProtoItem_add_subtree(lua_State *L) {
ProtoItem item = checkProtoItem(L,1);
- ProtoTree tree = NULL;
if (item) {
SubTree* ett = luaL_checkudata(L,2,SUBTREE);
+ ProtoTree tree;
if (ett && *ett) {
tree = proto_item_add_subtree(item,**ett);
} else {
tree = proto_item_add_subtree(item,lua_ett);
}
+
+ PUSH_PROTOTREE(L,tree);
+ } else {
+ pushProtoTree(L,NULL);
}
- pushProtoTree(L,tree);
return 1;
}
@@ -475,9 +487,11 @@ int ProtoItem_register(lua_State *L) {
lua_rawset(L, -3);
lua_pop(L, 1);
+ outstanding_stuff = g_ptr_array_new();
+
for(s = severities; s->str; s++) {
lua_pushstring(L, s->str);
- lua_pushstring(L, s->str);
+ lua_pushnumber(L, s->val);
lua_settable(L, LUA_GLOBALSINDEX);
}
diff --git a/plugins/lua/packet-lua.h b/plugins/lua/packet-lua.h
index 0dccf7d639..056a809c80 100644
--- a/plugins/lua/packet-lua.h
+++ b/plugins/lua/packet-lua.h
@@ -258,5 +258,6 @@ extern void lua_register_subtrees(void);
extern void clear_outstanding_tvbs(void);
extern void push_Pinfo(lua_State* L, Pinfo p);
extern void clear_outstanding_pinfos(void);
+extern void clear_outstanding_trees(void);
#endif