1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-17 13:09:02 +00:00

Better response to misuse of stdnse.base|new_thread when not executing an

action function (current == nil).
This commit is contained in:
batrick
2012-09-23 21:31:02 +00:00
parent 6b86535138
commit 4fe62b040c

View File

@@ -790,7 +790,7 @@ local function run (threads_iter, hosts)
return NSE_YIELD_VALUE; -- return NSE_YIELD_VALUE return NSE_YIELD_VALUE; -- return NSE_YIELD_VALUE
end end
_R[BASE] = function () _R[BASE] = function ()
return current.co; return current and current.co;
end end
-- _R[WAITING_TO_RUNNING] is called by nse_restore in nse_main.cc -- _R[WAITING_TO_RUNNING] is called by nse_restore in nse_main.cc
_R[WAITING_TO_RUNNING] = function (co, ...) _R[WAITING_TO_RUNNING] = function (co, ...)
@@ -823,6 +823,9 @@ local function run (threads_iter, hosts)
end end
rawset(stdnse, "new_thread", function (main, ...) rawset(stdnse, "new_thread", function (main, ...)
assert(type(main) == "function", "function expected"); assert(type(main) == "function", "function expected");
if current == nil then
error "stdnse.new_thread can only be run from an active script"
end
local co = create(function(...) main(...) end); -- do not return results local co = create(function(...) main(...) end); -- do not return results
print_debug(2, "%s spawning new thread (%s).", print_debug(2, "%s spawning new thread (%s).",
current.parent.info, tostring(co)); current.parent.info, tostring(co));
@@ -852,7 +855,7 @@ local function run (threads_iter, hosts)
return co, info; return co, info;
end); end);
rawset(stdnse, "base", function () rawset(stdnse, "base", function ()
return current.co; return current and current.co;
end); end);
while threads_iter and num_threads < CONCURRENCY_LIMIT do while threads_iter and num_threads < CONCURRENCY_LIMIT do
@@ -1285,6 +1288,10 @@ local function main (hosts, scantype)
print_verbose(1, "Script Post-scanning."); print_verbose(1, "Script Post-scanning.");
end end
-- These functions do not exist until we are executing action functions.
rawset(stdnse, "new_thread", nil)
rawset(stdnse, "base", nil)
for runlevel, scripts in ipairs(runlevels) do for runlevel, scripts in ipairs(runlevels) do
-- This iterator is passed to the run function. It returns one new script -- This iterator is passed to the run function. It returns one new script
-- thread on demand until exhausted. -- thread on demand until exhausted.