1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-12 02:39:03 +00:00

Previously, process_mainloop() assumed that there can occur only one event for l_nsock_loop(). This is obviously wrong. This caused that some lua threads wakeups (when multiple events happend for one nsock_loop) were delayed. They were handled but way after real events happened. This patch changes the handing of events. Now we execute every lua thread which is in running_scripts(). I hope that every thread will be scheduled in nsock and removed from running_scripts and added to waiting_scripts.

This commit is contained in:
majek04
2008-02-27 00:56:19 +00:00
parent 5ca15a1dab
commit caf8008940

View File

@@ -286,55 +286,54 @@ int process_mainloop(lua_State* l) {
} }
if(running_scripts.begin() == running_scripts.end()) while(running_scripts.begin() != running_scripts.end()){
continue; current = *(running_scripts.begin());
current = *(running_scripts.begin()); if (current.rr->host->timedOut(&now))
state = LUA_ERRRUN;
else
state = lua_resume(current.thread, current.resume_arguments);
if (current.rr->host->timedOut(&now)) if(state == LUA_YIELD) {
state = LUA_ERRRUN; // this script has performed a network io operation
else // we put it in the waiting
state = lua_resume(current.thread, current.resume_arguments); // when the network io operation has completed,
// a callback from the nsock library will put the
// script back into the running state
if(state == LUA_YIELD) { waiting_scripts.push_back(current);
// this script has performed a network io operation running_scripts.pop_front();
// we put it in the waiting } else if( state == 0) {
// when the network io operation has completed, // this script has finished
// a callback from the nsock library will put the // we first check if it produced output
// script back into the running state // then we release the thread and remove it from the
// running_scripts list
waiting_scripts.push_back(current); if(lua_isstring (current.thread, -1)) {
running_scripts.pop_front(); SCRIPT_ENGINE_TRY(process_getScriptId(current.thread, &ssr));
} else if( state == 0) { ssr.output = nse_printable
// this script has finished (lua_tostring(current.thread, -1), lua_objlen(current.thread, -1));
// we first check if it produced output if(current.rr->type == 0) {
// then we release the thread and remove it from the current.rr->host->scriptResults.push_back(ssr);
// running_scripts list } else if(current.rr->type == 1) {
current.rr->port->scriptResults.push_back(ssr);
if(lua_isstring (current.thread, -1)) { current.rr->host->ports.numscriptresults++;
SCRIPT_ENGINE_TRY(process_getScriptId(current.thread, &ssr)); }
ssr.output = nse_printable lua_pop(current.thread, 2);
(lua_tostring(current.thread, -1), lua_objlen(current.thread, -1));
if(current.rr->type == 0) {
current.rr->host->scriptResults.push_back(ssr);
} else if(current.rr->type == 1) {
current.rr->port->scriptResults.push_back(ssr);
current.rr->host->ports.numscriptresults++;
} }
lua_pop(current.thread, 2);
}
SCRIPT_ENGINE_TRY(process_finalize(l, current.registry_idx)); SCRIPT_ENGINE_TRY(process_finalize(l, current.registry_idx));
SCRIPT_ENGINE_TRY(lua_gc(l, LUA_GCCOLLECT, 0)); SCRIPT_ENGINE_TRY(lua_gc(l, LUA_GCCOLLECT, 0));
} else { } else {
// this script returned because of an error // this script returned because of an error
// print the failing reason if the verbose level is high enough // print the failing reason if the verbose level is high enough
SCRIPT_ENGINE_DEBUGGING( SCRIPT_ENGINE_DEBUGGING(
const char* errmsg = lua_tostring(current.thread, -1); const char* errmsg = lua_tostring(current.thread, -1);
log_write(LOG_STDOUT, "%s: %s\n", SCRIPT_ENGINE, errmsg); log_write(LOG_STDOUT, "%s: %s\n", SCRIPT_ENGINE, errmsg);
) )
SCRIPT_ENGINE_TRY(process_finalize(l, current.registry_idx)); SCRIPT_ENGINE_TRY(process_finalize(l, current.registry_idx));
} }
} // while
} }
progress.endTask(NULL, NULL); progress.endTask(NULL, NULL);