mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Add more assertions and checks for cross-thread socket use. See #1233
This commit is contained in:
10
nse_nsock.cc
10
nse_nsock.cc
@@ -329,6 +329,7 @@ static void status (lua_State *L, enum nse_status status)
|
||||
switch (status)
|
||||
{
|
||||
case NSE_STATUS_SUCCESS:
|
||||
assert(lua_status(L) == LUA_YIELD);
|
||||
lua_pushboolean(L, true);
|
||||
nse_restore(L, 1);
|
||||
break;
|
||||
@@ -339,6 +340,7 @@ static void status (lua_State *L, enum nse_status status)
|
||||
case NSE_STATUS_ERROR:
|
||||
case NSE_STATUS_TIMEOUT:
|
||||
case NSE_STATUS_PROXYERROR:
|
||||
assert(lua_status(L) == LUA_YIELD);
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, nse_status2str(status));
|
||||
nse_restore(L, 2);
|
||||
@@ -354,6 +356,7 @@ static void callback (nsock_pool nsp, nsock_event nse, void *ud)
|
||||
{
|
||||
nse_nsock_udata *nu = (nse_nsock_udata *) ud;
|
||||
lua_State *L = nu->thread;
|
||||
assert(nse_type(nse) != NSE_TYPE_READ);
|
||||
if (lua_status(L) == LUA_OK && nse_status(nse) == NSE_STATUS_ERROR) {
|
||||
// Sometimes Nsock fails immediately and callback is called before
|
||||
// l_connect has a chance to yield. We'll use nu->action to signal
|
||||
@@ -375,6 +378,10 @@ static int yield (lua_State *L, nse_nsock_udata *nu, const char *action,
|
||||
lua_pushthread(L);
|
||||
lua_rawseti(L, -2, THREAD_I);
|
||||
lua_pop(L, 1); /* nsock udata environment */
|
||||
if (nu->thread != NULL && nu->thread != L)
|
||||
{
|
||||
luaL_error(L, "Invalid reuse of a socket from one thread to another.");
|
||||
}
|
||||
nu->thread = L;
|
||||
nu->action = action;
|
||||
nu->direction = direction;
|
||||
@@ -609,9 +616,10 @@ static void receive_callback (nsock_pool nsp, nsock_event nse, void *udata)
|
||||
{
|
||||
nse_nsock_udata *nu = (nse_nsock_udata *) udata;
|
||||
lua_State *L = nu->thread;
|
||||
assert(lua_status(L) == LUA_YIELD);
|
||||
assert(nse_type(nse) == NSE_TYPE_READ);
|
||||
if (nse_status(nse) == NSE_STATUS_SUCCESS)
|
||||
{
|
||||
assert(lua_status(L) == LUA_YIELD);
|
||||
int len;
|
||||
const char *str = nse_readbuf(nse, &len);
|
||||
trace(nse_iod(nse), hexify((const unsigned char *) str, len).c_str(), FROM);
|
||||
|
||||
Reference in New Issue
Block a user