From 742ff671001a9e732470be7fd4c73b0b13f65dd5 Mon Sep 17 00:00:00 2001 From: batrick Date: Sat, 31 May 2008 02:19:24 +0000 Subject: [PATCH] Removed nse_auxiliar. Updated Script Argument parsing. Fixed typos in documentation. Improved MySQLinfo.nse. Nsock/dnet metatabels are now protected. --- Makefile.in | 6 +- docs/scripting.xml | 2 +- mswin32/nmap.vcproj | 4 -- nse_auxiliar.cc | 132 ------------------------------------------ nse_auxiliar.h | 53 ----------------- nse_debug.cc | 29 ++++++---- nse_init.cc | 114 ++++++++++++++---------------------- nse_main.cc | 10 ++-- nse_nsock.cc | 66 ++++++++++++--------- nse_pcrelib.cc | 27 ++++----- nselib/stdnse.lua | 5 +- scripts/MySQLinfo.nse | 11 +--- 12 files changed, 124 insertions(+), 335 deletions(-) delete mode 100644 nse_auxiliar.cc delete mode 100644 nse_auxiliar.h diff --git a/Makefile.in b/Makefile.in index 847be7a2d5..b7097dadab 100644 --- a/Makefile.in +++ b/Makefile.in @@ -60,9 +60,9 @@ INSTALLZENMAP=@INSTALLZENMAP@ UNINSTALLZENMAP=@UNINSTALLZENMAP@ ifneq (@LIBLUA_LIBS@,) -NSE_SRC=nse_main.cc nse_auxiliar.cc nse_nsock.cc nse_init.cc nse_nmaplib.cc nse_debug.cc nse_pcrelib.cc nse_string.cc -NSE_HDRS=nse_main.h nse_auxiliar.h nse_nsock.h nse_init.h nse_nmaplib.h nse_debug.h nse_macros.h nse_pcrelib.h nse_string.h -NSE_OBJS=nse_main.o nse_auxiliar.o nse_nsock.o nse_init.o nse_nmaplib.o nse_debug.o nse_pcrelib.o nse_string.o +NSE_SRC=nse_main.cc nse_nsock.cc nse_init.cc nse_nmaplib.cc nse_debug.cc nse_pcrelib.cc nse_string.cc +NSE_HDRS=nse_main.h nse_nsock.h nse_init.h nse_nmaplib.h nse_debug.h nse_macros.h nse_pcrelib.h nse_string.h +NSE_OBJS=nse_main.o nse_nsock.o nse_init.o nse_nmaplib.o nse_debug.o nse_pcrelib.o nse_string.o NSESTDLIB=nsestdlib endif diff --git a/docs/scripting.xml b/docs/scripting.xml index c3688e8a44..e71be45c0d 100644 --- a/docs/scripting.xml +++ b/docs/scripting.xml @@ -304,7 +304,7 @@ $ nmap -sC --script-args user=foo,pass=bar,anonFTP={pass=ftp@foobar.com} which would result in the Lua table: -{user="foo",pass="bar",anonFTP={pass=nobody@foobar.com}} +{user="foo",pass="bar",anonFTP={pass="nobody@foobar.com"}} You could therefore access the username ("foo") diff --git a/mswin32/nmap.vcproj b/mswin32/nmap.vcproj index be09681409..234bb250be 100644 --- a/mswin32/nmap.vcproj +++ b/mswin32/nmap.vcproj @@ -251,10 +251,6 @@ RelativePath="..\NmapOutputTable.cc" > - - diff --git a/nse_auxiliar.cc b/nse_auxiliar.cc deleted file mode 100644 index 9cd8aa16cd..0000000000 --- a/nse_auxiliar.cc +++ /dev/null @@ -1,132 +0,0 @@ -/*=========================================================================*\ -* Auxiliar routines for class hierarchy manipulation -* LuaSocket toolkit -* tailored for use with NSE -* -* RCS ID: $Id: auxiliar.c,v 1.14 2005/10/07 04:40:59 diego Exp $ -\*=========================================================================*/ -#include "nmap.h" -#include -#include - -#include "nse_auxiliar.h" - -/*-------------------------------------------------------------------------*\ -* Creates a new class with given methods -* Methods whose names start with __ are passed directly to the metatable. -\*-------------------------------------------------------------------------*/ -void auxiliar_newclass(lua_State *L, const char *classname, luaL_reg *func) { - luaL_newmetatable(L, classname); /* mt */ - /* create __index table to place methods */ - lua_pushstring(L, "__index"); /* mt,"__index" */ - lua_newtable(L); /* mt,"__index",it */ - /* put class name into class metatable */ - lua_pushstring(L, "class"); /* mt,"__index",it,"class" */ - lua_pushstring(L, classname); /* mt,"__index",it,"class",classname */ - lua_rawset(L, -3); /* mt,"__index",it */ - /* pass all methods that start with _ to the metatable, and all others - * to the index table */ - for (; func->name; func++) { /* mt,"__index",it */ - lua_pushstring(L, func->name); - lua_pushcfunction(L, func->func); - lua_rawset(L, func->name[0] == '_' ? -5: -3); - } - lua_rawset(L, -3); /* mt */ - lua_pop(L, 1); -} - -/*-------------------------------------------------------------------------*\ -* Prints the value of a class in a nice way -\*-------------------------------------------------------------------------*/ -int auxiliar_tostring(lua_State *L) { - char buf[32]; - if (!lua_getmetatable(L, 1)) goto error; - lua_pushstring(L, "__index"); - lua_gettable(L, -2); - if (!lua_istable(L, -1)) goto error; - lua_pushstring(L, "class"); - lua_gettable(L, -2); - if (!lua_isstring(L, -1)) goto error; - Snprintf(buf, 31, "%p", lua_touserdata(L, 1)); - lua_pushfstring(L, "%s: %s", lua_tostring(L, -1), buf); - return 1; -error: - lua_pushstring(L, "invalid object passed to 'auxiliar.c:__tostring'"); - lua_error(L); - return 1; -} - -/*-------------------------------------------------------------------------*\ -* Insert class into group -\*-------------------------------------------------------------------------*/ -void auxiliar_add2group(lua_State *L, const char *classname, const char *groupname) { - luaL_getmetatable(L, classname); - lua_pushstring(L, groupname); - lua_pushboolean(L, 1); - lua_rawset(L, -3); - lua_pop(L, 1); -} - -/*-------------------------------------------------------------------------*\ -* Return userdata pointer if object belongs to a given class, abort with -* error otherwise -\*-------------------------------------------------------------------------*/ -void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx) { - void *data = auxiliar_getclassudata(L, classname, objidx); - if (!data) { - char msg[45]; - Snprintf(msg, 44, "%.35s expected", classname); - luaL_argerror(L, objidx, msg); - } - return data; -} - -/*-------------------------------------------------------------------------*\ -* Return userdata pointer if object belongs to a given group, abort with -* error otherwise -\*-------------------------------------------------------------------------*/ -void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx) { - void *data = auxiliar_getgroupudata(L, groupname, objidx); - if (!data) { - char msg[45]; - Snprintf(msg, 44, "%.35s expected", groupname); - luaL_argerror(L, objidx, msg); - } - return data; -} - -/*-------------------------------------------------------------------------*\ -* Set object class -\*-------------------------------------------------------------------------*/ -void auxiliar_setclass(lua_State *L, const char *classname, int objidx) { - luaL_getmetatable(L, classname); - if (objidx < 0) objidx--; - lua_setmetatable(L, objidx); -} - -/*-------------------------------------------------------------------------*\ -* Get a userdata pointer if object belongs to a given group. Return NULL -* otherwise -\*-------------------------------------------------------------------------*/ -void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx) { - if (!lua_getmetatable(L, objidx)) - return NULL; - lua_pushstring(L, groupname); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { - lua_pop(L, 2); - return NULL; - } else { - lua_pop(L, 2); - return lua_touserdata(L, objidx); - } -} - -/*-------------------------------------------------------------------------*\ -* Get a userdata pointer if object belongs to a given class. Return NULL -* otherwise -\*-------------------------------------------------------------------------*/ -void *auxiliar_getclassudata(lua_State *L, const char *classname, int objidx) { - return luaL_checkudata(L, objidx, classname); -} - diff --git a/nse_auxiliar.h b/nse_auxiliar.h deleted file mode 100644 index 59e9b39262..0000000000 --- a/nse_auxiliar.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef NMAP_LUA_AUXILIAR_H -#define NMAP_LUA_AUXILIAR_H -// code stolen from luasocket and tailored to nmap -/*=========================================================================*\ -* Auxiliar routines for class hierarchy manipulation -* LuaSocket toolkit (but completely independent of other LuaSocket modules) -* -* A LuaSocket class is a name associated with Lua metatables. A LuaSocket -* group is a name associated with a class. A class can belong to any number -* of groups. This module provides the functionality to: -* -* - create new classes -* - add classes to groups -* - set the class of objects -* - check if an object belongs to a given class or group -* - get the userdata associated to objects -* - print objects in a pretty way -* -* LuaSocket class names follow the convention {}. Modules -* can define any number of classes and groups. The module tcp.c, for -* example, defines the classes tcp{master}, tcp{client} and tcp{server} and -* the groups tcp{client,server} and tcp{any}. Module functions can then -* perform type-checking on their arguments by either class or group. -* -* LuaSocket metatables define the __index metamethod as being a table. This -* table has one field for each method supported by the class, and a field -* "class" with the class name. -* -* The mapping from class name to the corresponding metatable and the -* reverse mapping are done using lauxlib. -* -* RCS ID: $Id: auxiliar.h,v 1.9 2005/10/07 04:40:59 diego Exp $ -\*=========================================================================*/ - -#include "nbase.h" - -extern "C" { -#include "lua.h" -#include "lualib.h" -#include "lauxlib.h" -} - -void auxiliar_newclass(lua_State *L, const char *classname, luaL_reg *func); -void auxiliar_add2group(lua_State *L, const char *classname, const char *group); -void auxiliar_setclass(lua_State *L, const char *classname, int objidx); -void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx); -void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx); -void *auxiliar_getclassudata(lua_State *L, const char *groupname, int objidx); -void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx); -int auxiliar_tostring(lua_State *L); - -#endif /* NMAP_LUA_AUXILIAR_H */ - diff --git a/nse_debug.cc b/nse_debug.cc index 1b22a09e9b..cc2802a131 100644 --- a/nse_debug.cc +++ b/nse_debug.cc @@ -15,21 +15,27 @@ void l_dumpStack(lua_State* l) { } void l_dumpValue(lua_State* l, int i) { - if(lua_istable(l, i)) + switch (lua_type(l, i)) + { + case LUA_TTABLE: l_dumpTable(l, i); - else if(lua_isfunction(l, i)) + break; + case LUA_TFUNCTION: l_dumpFunction(l, i); - else if(lua_isstring(l, i)) { - lua_pushvalue(l, i); - log_write(LOG_PLAIN, "string '%s'\n", lua_tostring(l, -1)); - lua_pop(l, 1); - } - else if(lua_isboolean(l, i)) - log_write(LOG_PLAIN, "boolean: %s", lua_toboolean(l, i) ? "true\n" : "false\n"); - else if(lua_isnumber(l, i)) + break; + case LUA_TSTRING: + log_write(LOG_PLAIN, "string '%s'\n", lua_tostring(l, i)); + break; + case LUA_TBOOLEAN: + log_write(LOG_PLAIN, "boolean: %s\n", + lua_toboolean(l, i) ? "true" : "false"); + break; + case LUA_TNUMBER: log_write(LOG_PLAIN, "number: %g\n", lua_tonumber(l, i)); - else + break; + default: log_write(LOG_PLAIN, "%s\n", lua_typename(l, lua_type(l, i))); + } } void l_dumpTable(lua_State *l, int index) { @@ -56,4 +62,3 @@ void l_dumpFunction(lua_State* l, int index) { // log_write(LOG_PLAIN, "\tname: %s %s\n", ar.namewhat, ar.name); fflush(stdout); } - diff --git a/nse_init.cc b/nse_init.cc index ab8c5fbae2..5d97113c23 100644 --- a/nse_init.cc +++ b/nse_init.cc @@ -36,9 +36,8 @@ int check_extension(const char* ext, const char* path); extern NmapOps o; /* open the standard libs */ -int init_lua(lua_State* l) { - - const luaL_Reg lualibs[] = { +int init_lua(lua_State* l) { // FIXME: Use cpcall, let Lua error normally. + static const luaL_Reg lualibs[] = { {"", luaopen_base}, {LUA_LOADLIBNAME, luaopen_package}, {LUA_TABLIBNAME, luaopen_table}, @@ -126,6 +125,7 @@ int init_setlualibpath(lua_State* l){ lua_pop(l,3); return SCRIPT_ENGINE_SUCCESS; } + /* parses the argument provided to --script-args and leaves the processed * string on the stack, after this it only has to be prepended with * "={" and appended by "}", before it can be called by @@ -134,42 +134,19 @@ int init_setlualibpath(lua_State* l){ int init_parseargs(lua_State* l){ //FIXME - free o.script-args after we're finished!!! - if(o.scriptargs==NULL){ //if no arguments are provided we're done - return SCRIPT_ENGINE_SUCCESS; - } - //prepare passed string for loading - lua_getglobal(l,"string"); - lua_getfield(l,-1,"gsub"); - lua_pushvalue(l,-1); - lua_pushstring(l,o.scriptargs); - lua_pushstring(l,"=([^{},$]+)"); - lua_pushstring(l,"=\"%1\""); - SCRIPT_ENGINE_TRY(lua_pcall(l,3,1,0)); - - /* copy the result on the bottom of the stack, since this is the part - * we want to return - */ - lua_pushvalue(l,-1); - lua_insert(l,1); - lua_pushstring(l,"%b{}"); - lua_pushstring(l,""); + if (o.scriptargs==NULL) + return SCRIPT_ENGINE_SUCCESS; //if no arguments are provided we're done + + lua_pushstring(l, o.scriptargs); + luaL_getmetafield(l, -1, "__index"); + lua_getfield(l, -1, "gsub"); + lua_pushvalue(l, -3); + lua_pushliteral(l, "=([^{},]+)"); + lua_pushliteral(l, "=\"%1\""); SCRIPT_ENGINE_TRY(lua_pcall(l,3,1,0)); - lua_getfield(l,-2,"find"); - lua_pushvalue(l,-2); - lua_pushstring(l,"[{}]"); - SCRIPT_ENGINE_TRY(lua_pcall(l,2,1,0)); - if(!lua_isnil(l,-1)){ - error("unbalanced brackets inside script-options!!"); - return SCRIPT_ENGINE_ERROR; - } + lua_replace(l, 1); lua_settop(l,1); //clear stack - //luaL_loadbuffer(l,tmp,strlen(tmp),"Script-Arguments"); - //if(lua_pcall(l,0,0,0)!=0){ -// error("error loading --script-args: %s",lua_tostring(l,-1)); -// return SCRIPT_ENGINE_ERROR; -// } - return SCRIPT_ENGINE_SUCCESS; } /* set the arguments inside the nmap.registry, for use by scripts @@ -184,12 +161,13 @@ int init_setargs(lua_State *l){ * processed using lua's functionality */ SCRIPT_ENGINE_TRY(init_parseargs(l)); - lua_pushstring(l,"nmap.registry.args={"); + lua_pushliteral(l,"nmap.registry.args={"); lua_insert(l,-2); - lua_pushstring(l,"}"); + lua_pushliteral(l,"}"); lua_concat(l,3); argbuf=lua_tolstring(l,-1,&argbuflen); - luaL_loadbuffer(l,argbuf,argbuflen,"Script-Arguments-prerun"); + luaL_loadbuffer(l,argbuf,argbuflen, "Script-Arguments"); + lua_replace(l, -2); // remove argbuf string if(lua_pcall(l,0,0,0)!=0){ error("error loading --script-args: %s",lua_tostring(l,-1)); return SCRIPT_ENGINE_ERROR; @@ -357,7 +335,7 @@ int init_updatedb(lua_State* l) { lua_newtable(l); /*give the script global namespace access*/ lua_newtable(l); - lua_getglobal(l, "_G"); + lua_pushvalue(l, LUA_GLOBALSINDEX); lua_setfield(l, -2, "__index"); lua_setmetatable(l, -2); @@ -702,28 +680,26 @@ int init_scandir(char* dirname, std::vector& result, int files_or_d #endif - - -// Takes a string and converts \, ', and " characters so that -// the string is suitable for embedding in a Lua ' or " string. -// Remember to free() when finished - -char *make_lua_escaped_string(char *str) { - char *tp, *out; - out = tp = (char *) safe_malloc((strlen(str)*2) + 1); // assume every character needs escaping - - while(*str) { - if (*str == '\\' || *str == '\'' || *str == '"') *tp++ = '\\'; - *tp++ = *str++; +/* Error function if a user script attempts to create a new global */ +/* TODO: Why wasn't _changing_ globals handled? */ +static int global_error(lua_State *L) +{ + lua_pushvalue(L, lua_upvalueindex(1)); + lua_pushvalue(L, 2); + if (!lua_tostring(L, -1)) + { + lua_pushliteral(L, "? (of type "); + lua_pushstring(L, lua_typename(L, lua_type(L, -2))); + lua_pushliteral(L, ")"); + lua_concat(L, 3); + lua_replace(L, -2); } - - *tp = '\0'; - - return out; + lua_pushvalue(L, lua_upvalueindex(2)); + lua_concat(L, 3); + fprintf(stderr, "%s\n", lua_tostring(L, -1)); + return lua_error(L); } - - /* load an nmap-lua script * create a new closure to store the script * tell the closure where to find the standard @@ -735,7 +711,6 @@ char *make_lua_escaped_string(char *str) { * */ int init_loadfile(lua_State* l, char* filename) { int rule_count; - char *escaped_filename; /* create a closure for encapsuled execution * give the closure access to the global enviroment @@ -749,7 +724,7 @@ int init_loadfile(lua_State* l, char* filename) { /* we give the script access to the global name space * */ lua_newtable(l); - lua_getglobal(l, "_G"); + lua_pushvalue(l, LUA_GLOBALSINDEX); lua_setfield(l, -2, "__index"); lua_setmetatable(l, -2); @@ -774,18 +749,15 @@ int init_loadfile(lua_State* l, char* filename) { * */ lua_getmetatable(l, -1); - escaped_filename = make_lua_escaped_string(filename); - - std::string buf = - (std::string("err = \"Attempted to change the global '\" .. select(2, ...) .. \"' in ") - + std::string(escaped_filename) - + std::string(" - use nmap.registry if you really want to share data between scripts.\"") - + std::string("error(err)")); - SCRIPT_ENGINE_LUA_TRY(luaL_loadbuffer(l, buf.c_str(), buf.length(), "Global Access")); + lua_pushliteral(l, "Attempted to change the global '"); + lua_pushliteral(l, "' in "); + lua_pushstring(l, filename); + lua_pushliteral(l, " - use nmap.registry if you really want to share " + "data between scripts."); + lua_concat(l, 3); + lua_pushcclosure(l, global_error, 2); lua_setfield(l, -2, "__newindex"); - free(escaped_filename); - lua_setmetatable(l, -2); /* store the initialized test in either diff --git a/nse_main.cc b/nse_main.cc index 439fb5ec80..1c04fa6d32 100644 --- a/nse_main.cc +++ b/nse_main.cc @@ -78,9 +78,9 @@ int script_updatedb() { SCRIPT_ENGINE); ) - l = lua_open(); + l = luaL_newstate(); if(l == NULL) { - error("%s: Failed lua_open()", SCRIPT_ENGINE); + error("%s: Failed luaL_newstate()", SCRIPT_ENGINE); return 0; } @@ -117,7 +117,7 @@ int script_check_args(){ const char *argbuf; size_t argbuflen; - l= lua_open(); + l= luaL_newstate(); if(l==NULL){ fatal("Error opening lua, for checking arguments\n"); } @@ -166,9 +166,9 @@ int script_scan(std::vector &targets) { SCRIPT_ENGINE, (*targets.begin())->NameIP(targetstr, sizeof(targetstr))); ) - l = lua_open(); + l = luaL_newstate(); if(l == NULL) { - error("%s: Failed lua_open()", SCRIPT_ENGINE); + error("%s: Failed luaL_newstate()", SCRIPT_ENGINE); return 0; } diff --git a/nse_nsock.cc b/nse_nsock.cc index 53539c8ddd..3ba0ed17be 100644 --- a/nse_nsock.cc +++ b/nse_nsock.cc @@ -1,5 +1,4 @@ #include "nse_nsock.h" -#include "nse_auxiliar.h" #include "nse_macros.h" #include "nse_string.h" @@ -81,7 +80,6 @@ static luaL_reg l_nsock [] = { {"get_info", l_nsock_get_info}, {"close", l_nsock_close}, {"set_timeout", l_nsock_set_timeout}, - {"__gc",l_nsock_gc}, {"pcap_open", l_nsock_ncap_open}, {"pcap_close", l_nsock_ncap_close}, {"pcap_register", l_nsock_ncap_register}, @@ -156,7 +154,15 @@ struct l_nsock_udata { void l_nsock_clear_buf(lua_State* l, l_nsock_udata* udata); int l_nsock_open(lua_State* l) { - auxiliar_newclass(l, "nsock", l_nsock); + luaL_newmetatable(l, "nsock"); + lua_createtable(l, 20, 0); + luaL_register(l, NULL, l_nsock); + lua_setfield(l, -2, "__index"); + lua_pushcclosure(l, l_nsock_gc, 0); + lua_setfield(l, -2, "__gc"); + lua_pushliteral(l, ""); + lua_setfield(l, -2, "__metatable"); // protect metatable + lua_pop(l, 1); nsp = nsp_new(NULL); //nsp_settrace(nsp, o.debugging, o.getStartTime()); @@ -169,7 +175,8 @@ int l_nsock_open(lua_State* l) { int l_nsock_new(lua_State* l) { struct l_nsock_udata* udata; udata = (struct l_nsock_udata*) lua_newuserdata(l, sizeof(struct l_nsock_udata)); - auxiliar_setclass(l, "nsock", -1); + luaL_getmetatable(l, "nsock"); + lua_setmetatable(l, -2); udata->nsiod = NULL; udata->ssl_session = NULL; udata->timeout = DEFAULT_TIMEOUT; @@ -223,7 +230,7 @@ static int l_nsock_connect_queued(lua_State* l) { const int max_descriptors_allowed = MAX(o.max_parallelism, 10); - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(udata->nsiod!=NULL){ /*should a script try to connect a socket, which is already connected @@ -276,7 +283,7 @@ void l_nsock_connect_queued_handler(nsock_pool nsp, nsock_event nse, void *lua_s static int l_nsock_connect(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); const char* addr = luaL_checkstring(l, 2); unsigned short port = (unsigned short) luaL_checkint(l, 3); const char *how = luaL_optstring(l, 4, "tcp"); @@ -350,7 +357,7 @@ void l_nsock_connect_handler(nsock_pool nsp, nsock_event nse, void *lua_state) { } static int l_nsock_send(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); const char* string = luaL_checkstring(l, 2); size_t string_len = lua_objlen (l, 2); char* hexified; @@ -384,7 +391,7 @@ void l_nsock_send_handler(nsock_pool nsp, nsock_event nse, void *lua_state) { } static int l_nsock_receive(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); l_nsock_clear_buf(l, udata); if(udata->nsiod == NULL) { @@ -399,7 +406,7 @@ static int l_nsock_receive(lua_State* l) { } static int l_nsock_receive_lines(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); int nlines = (int) luaL_checknumber(l, 2); l_nsock_clear_buf(l, udata); @@ -416,7 +423,7 @@ static int l_nsock_receive_lines(lua_State* l) { } static int l_nsock_receive_bytes(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); int nbytes = (int) luaL_checknumber(l, 2); l_nsock_clear_buf(l, udata); @@ -526,7 +533,7 @@ unsigned short inet_port_both(int af, const void* v_addr) { } static int l_nsock_get_info(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); int status; int protocol; // tcp or udp @@ -558,7 +565,7 @@ static int l_nsock_get_info(lua_State* l) { return 5; } static int l_nsock_gc(lua_State* l){ - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(udata->nsiod == NULL) { //socket obviously got closed already - so no finalization needed return 0; }else{ @@ -569,7 +576,7 @@ static int l_nsock_gc(lua_State* l){ } static int l_nsock_close(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); /* Never ever collect nse-pcap connections. */ if(udata->ncap_socket){ @@ -613,7 +620,7 @@ static int l_nsock_close(lua_State* l) { } static int l_nsock_set_timeout(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); int timeout = (unsigned short) luaL_checkint(l, 2); udata->timeout = timeout; @@ -623,7 +630,7 @@ static int l_nsock_set_timeout(lua_State* l) { /* buffered I/O */ static int l_nsock_receive_buf(lua_State* l) { - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(lua_gettop(l)==2){ /*we were called with 2 arguments only - push the default third one*/ lua_pushboolean(l,true); @@ -663,7 +670,7 @@ void l_nsock_receive_buf_handler(nsock_pool nsp, nsock_event nse, void *lua_stat int rcvd_len = 0; char* hexified; int tmpidx; - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(l_nsock_checkstatus(l, nse) == NSOCK_WRAPPER_SUCCESS) { //l_nsock_checkstatus pushes true on the stack in case of success @@ -722,7 +729,7 @@ int l_nsock_check_buf(lua_State* l ){ /*should we return the string including the pattern or without it */ keeppattern= lua_toboolean(l,-1); lua_pop(l,1); - udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(lua_isfunction(l,2)){ lua_pushvalue(l,2); lua_rawgeti(l, LUA_REGISTRYINDEX, udata->bufidx); /* the buffer is the only argument to the function */ @@ -860,7 +867,7 @@ char *dnet_to_pcap_device_name(const char *device){ * 5) bpf - berkeley packet filter, see tcpdump(8) * */ static int l_nsock_ncap_open(lua_State* l){ - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); const char* device = luaL_checkstring(l, 2); int snaplen = luaL_checkint(l, 3); int promisc = luaL_checkint(l, 4); @@ -915,7 +922,7 @@ static int l_nsock_ncap_open(lua_State* l){ /* (LUA) Close nsock-pcap socket. * */ static int l_nsock_ncap_close(lua_State* l){ - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); struct ncap_socket *ns = udata->ncap_socket; if(!udata->nsiod || !udata->ncap_socket) { @@ -1004,7 +1011,7 @@ void ncap_request_map_add(char *key, struct ncap_request *nr){ * want to receive first packet * */ static int l_nsock_ncap_register(lua_State *l){ - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); size_t testdatasz; const char* testdata = luaL_checklstring(l, 2, &testdatasz); @@ -1046,7 +1053,7 @@ static int l_nsock_ncap_register(lua_State *l){ * return values: status(true/false), capture_len/error_msg, layer2data, layer3data * */ int l_nsock_pcap_receive(lua_State *l){ - l_nsock_udata* udata = (l_nsock_udata*) auxiliar_checkclass(l, "nsock", 1); + l_nsock_udata* udata = (l_nsock_udata*) luaL_checkudata(l, 1, "nsock"); if(!udata->nsiod || !udata->ncap_socket) { luaL_argerror(l, 1, "You can't receive to nsock-pcap if it wasn't opened."); return 0; @@ -1259,7 +1266,13 @@ static luaL_reg l_dnet [] = { }; int l_dnet_open(lua_State* l) { - auxiliar_newclass(l, "dnet", l_dnet); + luaL_newmetatable(l, "dnet"); + lua_createtable(l, 5, 0); + luaL_register(l, NULL, l_dnet); + lua_setfield(l, -2, "__index"); + lua_pushliteral(l, ""); + lua_setfield(l, -2, "__metatable"); // protect metatable + lua_pop(l, 1); return NSOCK_WRAPPER_SUCCESS; } @@ -1271,7 +1284,8 @@ struct l_dnet_udata { int l_dnet_new(lua_State* l) { struct l_dnet_udata* udata; udata = (struct l_dnet_udata*) lua_newuserdata(l, sizeof(struct l_dnet_udata)); - auxiliar_setclass(l, "dnet", -1); + luaL_getmetatable(l, "dnet"); + lua_setmetatable(l, -2); udata->interface= NULL; udata->eth = NULL; @@ -1352,7 +1366,7 @@ void ldnet_eth_close_cached(const char *device) { } static int l_dnet_open_ethernet(lua_State* l){ - l_dnet_udata* udata = (l_dnet_udata*) auxiliar_checkclass(l, "dnet", 1); + l_dnet_udata* udata = (l_dnet_udata*) luaL_checkudata(l, 1, "dnet"); const char* interface_name = luaL_checkstring(l, 2); struct interface_info *ii = getInterfaceByName((char*)interface_name); @@ -1367,7 +1381,7 @@ static int l_dnet_open_ethernet(lua_State* l){ } static int l_dnet_close_ethernet(lua_State* l){ - l_dnet_udata* udata = (l_dnet_udata*) auxiliar_checkclass(l, "dnet", 1); + l_dnet_udata* udata = (l_dnet_udata*) luaL_checkudata(l, 1, "dnet"); if(!udata->interface || !udata->eth){ luaL_argerror(l, 1, "dnet is not valid opened ethernet interface"); return 0; @@ -1381,7 +1395,7 @@ static int l_dnet_close_ethernet(lua_State* l){ } static int l_dnet_send_ethernet(lua_State* l){ - l_dnet_udata* udata = (l_dnet_udata*) auxiliar_checkclass(l, "dnet", 1); + l_dnet_udata* udata = (l_dnet_udata*) luaL_checkudata(l, 1, "dnet"); size_t packetsz = 0; const char* packet = luaL_checklstring(l, 2, &packetsz); diff --git a/nse_pcrelib.cc b/nse_pcrelib.cc index 133aeda9be..370c1238c0 100644 --- a/nse_pcrelib.cc +++ b/nse_pcrelib.cc @@ -25,14 +25,6 @@ extern "C" { #include "nse_pcrelib.h" -static void L_lua_error(lua_State *L, const char *message) -{ - int status; - - lua_pushstring(L, message); - status = lua_error(L); -} - static int get_startoffset(lua_State *L, int stackpos, size_t len) { int startoffset = luaL_optint(L, stackpos, 1); @@ -105,12 +97,12 @@ static const unsigned char *Lpcre_maketables(lua_State *L, int stackpos) char *locale = strdup(luaL_checkstring(L, stackpos)); if(locale == NULL) - L_lua_error(L, "cannot set locale"); + luaL_error(L, "cannot set locale"); strncpy(old_locale, setlocale(LC_CTYPE, NULL), 255); /* store the locale */ if(setlocale(LC_CTYPE, locale) == NULL) /* set new locale */ - L_lua_error(L, "cannot set locale"); + luaL_error(L, "cannot set locale"); tables = pcre_maketables(); /* make tables with new locale */ (void)setlocale(LC_CTYPE, old_locale); /* restore the old locale */ @@ -132,7 +124,7 @@ static int Lpcre_comp(lua_State *L) if(lua_gettop(L) > 2 && !lua_isnil(L, 3)) tables = Lpcre_maketables(L, 3); if(tables == NULL) - L_lua_error(L, "PCRE compilation failed"); + luaL_error(L, "PCRE compilation failed"); ud = (pcre2*)lua_newuserdata(L, sizeof(pcre2)); luaL_getmetatable(L, pcre_handle); @@ -145,11 +137,11 @@ static int Lpcre_comp(lua_State *L) if(!ud->pr) { (void)Snprintf(buf, 255, "%s (pattern offset: %d)", error, erroffset+1); /* show offset 1-based as it's common in Lua */ - L_lua_error(L, buf); + luaL_error(L, buf); } ud->extra = pcre_study(ud->pr, 0, &error); - if(error) L_lua_error(L, error); + if(error) luaL_error(L, error); pcre_fullinfo(ud->pr, ud->extra, PCRE_INFO_CAPTURECOUNT, &ud->ncapt); /* need (2 ints per capture, plus one for substring match) * 3/2 */ @@ -408,10 +400,13 @@ static const luaL_reg pcrelib[] = { LUALIB_API int luaopen_pcrelib(lua_State *L) { - createmeta(L, pcre_handle); - luaL_openlib(L, NULL, pcremeta, 0); + luaL_newmetatable(L, pcre_handle); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -2); + lua_rawset(L, -3); + luaL_register(L, NULL, pcremeta); lua_pop(L, 1); - luaL_openlib(L, NSE_PCRELIBNAME, pcrelib, 0); + luaL_register(L, NSE_PCRELIBNAME, pcrelib); return 1; } diff --git a/nselib/stdnse.lua b/nselib/stdnse.lua index 694f55ef90..56da3b5318 100644 --- a/nselib/stdnse.lua +++ b/nselib/stdnse.lua @@ -1,5 +1,6 @@ -- See nmaps COPYING for licence -module(... or "stdnse", package.seeall) + +module(..., package.seeall) print_debug = function(...) local verbosity = 1; @@ -28,7 +29,7 @@ function strsplit(delimiter, text) error("delimiter matches empty string!") end - while 1 do + while true do local first, last = string.find(text, delimiter, pos) if first then -- found? table.insert(list, string.sub(text, pos, first-1)) diff --git a/scripts/MySQLinfo.nse b/scripts/MySQLinfo.nse index 655f707e8c..089153020a 100644 --- a/scripts/MySQLinfo.nse +++ b/scripts/MySQLinfo.nse @@ -21,16 +21,7 @@ require 'bit' -- Grabs NUL-terminated string local getstring = function(orig) - local str = "" - local index = 1 - - while orig:byte(index) ~= 0 do - str = str .. string.char(orig:byte(index)) - - index = index + 1 - end - - return str + return orig:match("^([^%z]*)"); end -- Convert two bytes into a number