diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2013-09-07 10:56:52 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2013-09-07 10:56:52 +0000 |
commit | 6b93b0e1dc32a2d652b7f03a01ee3ec84b7383e3 (patch) | |
tree | 67179a09740eb815fbb750c8c9bc1121f48cfab3 | |
parent | 071f89e3b39b39f9e1a9afca521259cb6f46c33a (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.c | 33 |
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); |