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

o [NSE] Fixed a race condition in broadcast-dhcp-discover.nse that

could cause responses to be missed on fast networks. It was noticed
  by Vasiliy Kulikov. [David]
This commit is contained in:
david
2012-01-10 03:25:19 +00:00
parent 4411be7e05
commit 2532c413b5
2 changed files with 14 additions and 9 deletions

View File

@@ -80,12 +80,10 @@ end
-- @param timeout number of ms to wait for a response
-- @param xid the DHCP transaction id
-- @param result a table to which the result is written
local function dhcp_listener(iface, timeout, xid, result)
local sock = nmap.new_socket()
local function dhcp_listener(sock, timeout, xid, result)
local condvar = nmap.condvar(result)
sock:set_timeout(100)
sock:pcap_open(iface, 1500, false, "ip && udp && port 68")
local start_time = nmap.clock_ms()
while( nmap.clock_ms() - start_time < timeout ) do
@@ -158,20 +156,23 @@ action = function()
local status, packet = dhcp.dhcp_build(request_type, ip_address, mac, nil, request_options, overrides, lease_time, transaction_id)
if (not(status)) then return "\n ERROR: Failed to build packet" end
local socket = nmap.new_socket("udp")
socket:bind(nil, 68)
socket:sendto( host, port, packet )
socket:close()
local threads = {}
local result = {}
local condvar = nmap.condvar(result)
-- start a listening thread for each interface
for iface, _ in pairs(interfaces) do
local co = stdnse.new_thread( dhcp_listener, iface, timeout, transaction_id, result )
local sock, co
sock = nmap.new_socket()
sock:pcap_open(iface, 1500, false, "ip && udp && port 68")
co = stdnse.new_thread( dhcp_listener, sock, timeout, transaction_id, result )
threads[co] = true
end
local socket = nmap.new_socket("udp")
socket:bind(nil, 68)
socket:sendto( host, port, packet )
socket:close()
-- wait until all threads are done
repeat