aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2013-09-07 10:56:52 +0000
committerStig Bjørlykke <stig@bjorlykke.org>2013-09-07 10:56:52 +0000
commit6b93b0e1dc32a2d652b7f03a01ee3ec84b7383e3 (patch)
tree67179a09740eb815fbb750c8c9bc1121f48cfab3
parent071f89e3b39b39f9e1a9afca521259cb6f46c33a (diff)
Added syntax and range checks for Lua Prefs.range default values.
Fixed some small memory leakages. svn path=/trunk/; revision=51815
-rw-r--r--epan/wslua/wslua_proto.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/epan/wslua/wslua_proto.c b/epan/wslua/wslua_proto.c
index 744839d615..6e85b58a57 100644
--- a/epan/wslua/wslua_proto.c
+++ b/epan/wslua/wslua_proto.c
@@ -37,12 +37,7 @@
WSLUA_CLASS_DEFINE(Pref,NOP,NOP); /* A preference of a Protocol. */
-static range_t* get_range(lua_State *L, int idx_r, int idx_m)
-{
- static range_t *ret;
- range_convert_str(&ret,g_strdup(luaL_checkstring(L, idx_r)),(guint32)lua_tonumber(L, idx_m));
- return ret;
-}
+static range_t* get_range(lua_State *L, int idx_r, int idx_m);
static enum_val_t* get_enum(lua_State *L, int idx)
{
@@ -211,6 +206,28 @@ WSLUA_CONSTRUCTOR Pref_statictext(lua_State* L) {
return new_pref(L,PREF_STATIC_TEXT);
}
+static range_t* get_range(lua_State *L, int idx_r, int idx_m)
+{
+ static range_t *ret = NULL;
+ gchar *pattern = g_strdup(luaL_checkstring(L, idx_r));
+
+ switch (range_convert_str(&ret, pattern, (guint32)lua_tonumber(L, idx_m))) {
+ case CVT_NO_ERROR:
+ break;
+ case CVT_SYNTAX_ERROR:
+ WSLUA_ARG_ERROR(Pref_range,DEFAULT,"syntax error in default range");
+ break;
+ case CVT_NUMBER_TOO_BIG:
+ WSLUA_ARG_ERROR(Pref_range,DEFAULT,"value too large in default range");
+ break;
+ default:
+ WSLUA_ARG_ERROR(Pref_range,DEFAULT,"unknown error in default range");
+ break;
+ }
+
+ g_free (pattern);
+ return ret;
+}
/* Gets registered as metamethod automatically by WSLUA_REGISTER_CLASS/META */
static int Pref__gc(lua_State* L) {
Pref pref = checkPref(L,1);
@@ -1768,6 +1785,7 @@ WSLUA_METHOD DissectorTable_add (lua_State *L) {
if (type == FT_STRING) {
gchar* pattern = g_strdup(luaL_checkstring(L,WSLUA_ARG_DissectorTable_add_PATTERN));
dissector_add_string(dt->name, pattern,handle);
+ g_free (pattern);
} else if ( type == FT_UINT32 || type == FT_UINT16 || type == FT_UINT8 || type == FT_UINT24 ) {
int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_add_PATTERN);
dissector_add_uint(dt->name, port, handle);
@@ -1798,13 +1816,14 @@ WSLUA_METHOD DissectorTable_remove (lua_State *L) {
} else if ( isDissector(L,WSLUA_ARG_DissectorTable_remove_DISSECTOR) ) {
handle = toDissector(L,WSLUA_ARG_DissectorTable_remove_DISSECTOR);
} else
- WSLUA_ARG_ERROR(DissectorTable_add,DISSECTOR,"must be either Proto or Dissector");
+ WSLUA_ARG_ERROR(DissectorTable_remove,DISSECTOR,"must be either Proto or Dissector");
type = get_dissector_table_selector_type(dt->name);
if (type == FT_STRING) {
gchar* pattern = g_strdup(luaL_checkstring(L,WSLUA_ARG_DissectorTable_remove_PATTERN));
dissector_delete_string(dt->name, pattern,handle);
+ g_free (pattern);
} else if ( type == FT_UINT32 || type == FT_UINT16 || type == FT_UINT8 || type == FT_UINT24 ) {
int port = luaL_checkint(L, WSLUA_ARG_DissectorTable_remove_PATTERN);
dissector_delete_uint(dt->name, port, handle);