mirror of
https://github.com/nmap/nmap.git
synced 2025-12-07 13:11:28 +00:00
[NSE] Added
nse_gettarget (lua_State *L, int index); to replace the current_hosts static variable shared between nse_main.cc and nse_nmaplib.cc. This improves locality and offers a clearer interface.
This commit is contained in:
25
nse_main.cc
25
nse_main.cc
@@ -29,13 +29,12 @@
|
|||||||
#define NSE_WAITING_TO_RUNNING "NSE_WAITING_TO_RUNNING"
|
#define NSE_WAITING_TO_RUNNING "NSE_WAITING_TO_RUNNING"
|
||||||
#define NSE_DESTRUCTOR "NSE_DESTRUCTOR"
|
#define NSE_DESTRUCTOR "NSE_DESTRUCTOR"
|
||||||
#define NSE_SELECTED_BY_NAME "NSE_SELECTED_BY_NAME"
|
#define NSE_SELECTED_BY_NAME "NSE_SELECTED_BY_NAME"
|
||||||
|
#define NSE_CURRENT_HOSTS "NSE_CURRENT_HOSTS"
|
||||||
|
|
||||||
#define MAX_FILENAME_LEN 4096
|
#define MAX_FILENAME_LEN 4096
|
||||||
|
|
||||||
extern NmapOps o;
|
extern NmapOps o;
|
||||||
|
|
||||||
int current_hosts = LUA_NOREF;
|
|
||||||
|
|
||||||
static int timedOut (lua_State *L)
|
static int timedOut (lua_State *L)
|
||||||
{
|
{
|
||||||
Target *target = get_target(L, 1);
|
Target *target = get_target(L, 1);
|
||||||
@@ -384,10 +383,8 @@ static int init_main (lua_State *L)
|
|||||||
luaL_openlibs(L);
|
luaL_openlibs(L);
|
||||||
set_nmap_libraries(L);
|
set_nmap_libraries(L);
|
||||||
|
|
||||||
/* Load current_hosts */
|
|
||||||
luaL_unref(L, LUA_REGISTRYINDEX, current_hosts);
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
current_hosts = luaL_ref(L, LUA_REGISTRYINDEX);
|
lua_setfield(L, LUA_REGISTRYINDEX, NSE_CURRENT_HOSTS);
|
||||||
|
|
||||||
/* Load debug.traceback for collecting any error tracebacks */
|
/* Load debug.traceback for collecting any error tracebacks */
|
||||||
lua_settop(L, 0); /* clear the stack */
|
lua_settop(L, 0); /* clear the stack */
|
||||||
@@ -435,9 +432,8 @@ static int run_main (lua_State *L)
|
|||||||
lua_settop(L, 0);
|
lua_settop(L, 0);
|
||||||
|
|
||||||
/* New host group */
|
/* New host group */
|
||||||
luaL_unref(L, LUA_REGISTRYINDEX, current_hosts);
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
current_hosts = luaL_ref(L, LUA_REGISTRYINDEX);
|
lua_setfield(L, LUA_REGISTRYINDEX, NSE_CURRENT_HOSTS);
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, NSE_TRACEBACK); /* index 1 */
|
lua_getfield(L, LUA_REGISTRYINDEX, NSE_TRACEBACK); /* index 1 */
|
||||||
|
|
||||||
@@ -448,6 +444,7 @@ static int run_main (lua_State *L)
|
|||||||
* This has all the target names, 1-N, in a list.
|
* This has all the target names, 1-N, in a list.
|
||||||
*/
|
*/
|
||||||
lua_createtable(L, targets->size(), 0); // stack index 3
|
lua_createtable(L, targets->size(), 0); // stack index 3
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, NSE_CURRENT_HOSTS); /* index 4 */
|
||||||
for (std::vector<Target *>::iterator ti = targets->begin();
|
for (std::vector<Target *>::iterator ti = targets->begin();
|
||||||
ti != targets->end(); ti++)
|
ti != targets->end(); ti++)
|
||||||
{
|
{
|
||||||
@@ -457,15 +454,14 @@ static int run_main (lua_State *L)
|
|||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
set_hostinfo(L, target);
|
set_hostinfo(L, target);
|
||||||
lua_rawseti(L, 3, lua_objlen(L, 3) + 1);
|
lua_rawseti(L, 3, lua_objlen(L, 3) + 1);
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, current_hosts);
|
|
||||||
if (TargetName != NULL && strcmp(TargetName, "") != 0)
|
if (TargetName != NULL && strcmp(TargetName, "") != 0)
|
||||||
lua_pushstring(L, TargetName);
|
lua_pushstring(L, TargetName);
|
||||||
else
|
else
|
||||||
lua_pushstring(L, targetipstr);
|
lua_pushstring(L, targetipstr);
|
||||||
lua_pushlightuserdata(L, target);
|
lua_pushlightuserdata(L, target);
|
||||||
lua_rawset(L, -3);
|
lua_rawset(L, 4); /* add to NSE_CURRENT_HOSTS */
|
||||||
lua_pop(L, 1); /* current_hosts */
|
|
||||||
}
|
}
|
||||||
|
lua_pop(L, 1); /* pop NSE_CURRENT_HOSTS */
|
||||||
|
|
||||||
if (lua_pcall(L, 1, 0, 1) != 0) lua_error(L); /* we wanted a traceback */
|
if (lua_pcall(L, 1, 0, 1) != 0) lua_error(L); /* we wanted a traceback */
|
||||||
|
|
||||||
@@ -539,6 +535,15 @@ void nse_selectedbyname (lua_State *L)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nse_gettarget (lua_State *L, int index)
|
||||||
|
{
|
||||||
|
lua_pushvalue(L, index);
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, NSE_CURRENT_HOSTS);
|
||||||
|
lua_insert(L, -2);
|
||||||
|
lua_rawget(L, -2);
|
||||||
|
lua_replace(L, -2);
|
||||||
|
}
|
||||||
|
|
||||||
static lua_State *L_NSE = NULL;
|
static lua_State *L_NSE = NULL;
|
||||||
|
|
||||||
void open_nse (void)
|
void open_nse (void)
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ void nse_restore (lua_State *, int);
|
|||||||
void nse_destructor (lua_State *, char);
|
void nse_destructor (lua_State *, char);
|
||||||
void nse_base (lua_State *);
|
void nse_base (lua_State *);
|
||||||
void nse_selectedbyname (lua_State *);
|
void nse_selectedbyname (lua_State *);
|
||||||
|
void nse_gettarget (lua_State *, int);
|
||||||
|
|
||||||
void open_nse (void);
|
void open_nse (void);
|
||||||
void script_scan (std::vector<Target *> &targets);
|
void script_scan (std::vector<Target *> &targets);
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern NmapOps o;
|
extern NmapOps o;
|
||||||
extern int current_hosts;
|
|
||||||
|
|
||||||
void set_version(lua_State *L, struct serviceDeductions sd) {
|
void set_version(lua_State *L, struct serviceDeductions sd) {
|
||||||
SCRIPT_ENGINE_PUSHSTRING_NOTNULL(sd.name, "name");
|
SCRIPT_ENGINE_PUSHSTRING_NOTNULL(sd.name, "name");
|
||||||
@@ -335,11 +334,9 @@ Target *get_target (lua_State *L, int index)
|
|||||||
lua_getfield(L, index, "ip");
|
lua_getfield(L, index, "ip");
|
||||||
if (!(lua_isstring(L, -2) || lua_isstring(L, -1)))
|
if (!(lua_isstring(L, -2) || lua_isstring(L, -1)))
|
||||||
luaL_error(L, "host table does not have a 'ip' or 'targetname' field");
|
luaL_error(L, "host table does not have a 'ip' or 'targetname' field");
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, current_hosts);
|
|
||||||
if (lua_isstring(L, -3)) /* targetname */
|
if (lua_isstring(L, -3)) /* targetname */
|
||||||
{
|
{
|
||||||
lua_pushvalue(L, -3);
|
nse_gettarget(L, -3); /* use targetname */
|
||||||
lua_rawget(L, -2);
|
|
||||||
if (lua_islightuserdata(L, -1))
|
if (lua_islightuserdata(L, -1))
|
||||||
goto done;
|
goto done;
|
||||||
else
|
else
|
||||||
@@ -347,8 +344,7 @@ Target *get_target (lua_State *L, int index)
|
|||||||
}
|
}
|
||||||
if (lua_isstring(L, -2)) /* ip */
|
if (lua_isstring(L, -2)) /* ip */
|
||||||
{
|
{
|
||||||
lua_pushvalue(L, -2); /* ip */
|
nse_gettarget(L, -2); /* use ip */
|
||||||
lua_rawget(L, -2);
|
|
||||||
if (!lua_islightuserdata(L, -1))
|
if (!lua_islightuserdata(L, -1))
|
||||||
luaL_argerror(L, 1, "host is not being processed right now");
|
luaL_argerror(L, 1, "host is not being processed right now");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user