diff --git a/FPEngine.cc b/FPEngine.cc index 667461762..9d437d472 100644 --- a/FPEngine.cc +++ b/FPEngine.cc @@ -184,17 +184,9 @@ void FPNetworkControl::init(const char *ifname, devtype iftype) { fatal("dnet: failed to open device %s", ifname); this->rawsd = -1; } else { -#ifdef WIN32 - win32_fatal_raw_sockets(ifname); -#endif if (this->rawsd >= 0) close(this->rawsd); - if ((this->rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) - pfatal("Couldn't obtain raw socket in %s", __func__); - broadcast_socket(this->rawsd); -#ifndef WIN32 - sethdrinclude(this->rawsd); -#endif + rawsd = nmap_raw_socket(ifname); } /* De-register existing callers */ diff --git a/idle_scan.cc b/idle_scan.cc index a85af0a72..557a6e885 100644 --- a/idle_scan.cc +++ b/idle_scan.cc @@ -382,16 +382,8 @@ static void initialize_idleproxy(struct idle_proxy_info *proxy, char *proxyName, proxy->rawsd = -1; proxy->ethptr = &proxy->eth; } else { -#ifdef WIN32 - win32_fatal_raw_sockets(proxy->host.deviceName()); -#endif - if ((proxy->rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) - pfatal("socket troubles in %s", __func__); + proxy->rawsd = nmap_raw_socket(proxy->host.deviceName()); unblock_socket(proxy->rawsd); - broadcast_socket(proxy->rawsd); -#ifndef WIN32 - sethdrinclude(proxy->rawsd); -#endif proxy->eth.ethsd = NULL; proxy->ethptr = NULL; } diff --git a/nse_dnet.cc b/nse_dnet.cc index 95c275123..eefea2d9c 100644 --- a/nse_dnet.cc +++ b/nse_dnet.cc @@ -187,14 +187,10 @@ static int ethernet_send (lua_State *L) static int ip_open (lua_State *L) { nse_dnet_udata *udata = (nse_dnet_udata *) nseU_checkudata(L, 1, DNET_METATABLE, "dnet"); - udata->sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + udata->sock = nmap_raw_socket(NULL); if (udata->sock == -1) return luaL_error(L, "failed to open raw socket: %s (errno %d)", socket_strerror(socket_errno()), socket_errno()); - broadcast_socket(udata->sock); -#ifndef WIN32 - sethdrinclude(udata->sock); -#endif return nseU_success(L); } diff --git a/osscan2.cc b/osscan2.cc index 243b343e1..b3d94d45d 100644 --- a/osscan2.cc +++ b/osscan2.cc @@ -1268,17 +1268,8 @@ HostOsScan::HostOsScan(Target *t) { fatal("%s: Failed to open ethernet device (%s)", __func__, t->deviceName()); rawsd = -1; } else { - /* Init our raw socket */ -#ifdef WIN32 - win32_fatal_raw_sockets(t->deviceName()); -#endif - if ((rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 ) - pfatal("socket troubles in %s", __func__); + rawsd = nmap_raw_socket(t->deviceName()); unblock_socket(rawsd); - broadcast_socket(rawsd); -#ifndef WIN32 - sethdrinclude(rawsd); -#endif ethsd = NULL; } diff --git a/scan_engine.cc b/scan_engine.cc index 0c3f0cf50..3725be5cd 100644 --- a/scan_engine.cc +++ b/scan_engine.cc @@ -1662,20 +1662,11 @@ void UltraScanInfo::Init(vector &Targets, struct scan_lists *pts, styp fatal("dnet: Failed to open device %s", Targets[0]->deviceName()); rawsd = -1; } else { - /* Initialize a raw socket */ -#ifdef WIN32 - win32_fatal_raw_sockets(Targets[0]->deviceName()); -#endif - if ((rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 ) - pfatal("socket troubles in %s", __func__); + rawsd = nmap_raw_socket(Targets[0]->deviceName()); /* We do not wan't to unblock the socket since we want to wait if kernel send buffers fill up rather than get ENOBUF, and we won't be receiving on the socket anyway unblock_socket(rawsd);*/ - broadcast_socket(rawsd); -#ifndef WIN32 - sethdrinclude(rawsd); -#endif ethsd = NULL; } } diff --git a/tcpip.cc b/tcpip.cc index 11a65311e..8370a510e 100644 --- a/tcpip.cc +++ b/tcpip.cc @@ -138,6 +138,30 @@ static PacketCounter PktCt; +/* Create a raw socket and do things that always apply to raw sockets: + * Emit a fatal error on Windows. + * Set SO_BROADCAST. + * Set IP_HDRINCL. + The socket is created with address family AF_INET, but may be usable for + AF_INET6, depending on the operating system. + + The argument warning_device_name is used *only* in the Windows fatal error + message, and does not affect any socket characteristics. */ +int nmap_raw_socket(const char *warning_device_name) { + int rawsd; + +#ifdef WIN32 + win32_fatal_raw_sockets(Targets[0]->deviceName()); +#endif + if ((rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 ) + pfatal("socket troubles in %s", __func__); + broadcast_socket(rawsd); +#ifndef WIN32 + sethdrinclude(rawsd); +#endif + + return rawsd; +} /* Fill buf (up to buflen -- truncate if necessary but always terminate) with a short representation of the packet stats. diff --git a/tcpip.h b/tcpip.h index 31efdda0a..cdf82df8f 100644 --- a/tcpip.h +++ b/tcpip.h @@ -200,6 +200,7 @@ extern "C" { #define INET_ADDRSTRLEN 16 #endif +int nmap_raw_socket(const char *warning_device_name); /* Used for tracing all packets sent or received (eg the --packet-trace option) */ diff --git a/traceroute.cc b/traceroute.cc index 88595df8f..4bafc6e1c 100644 --- a/traceroute.cc +++ b/traceroute.cc @@ -851,16 +851,7 @@ TracerouteState::TracerouteState(std::vector &targets) { fatal("dnet: failed to open device %s", targets[0]->deviceName()); rawsd = -1; } else { -#ifdef WIN32 - win32_fatal_raw_sockets(targets[0]->deviceName()); -#endif - rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); - if (rawsd == -1) - pfatal("traceroute: socket troubles"); - broadcast_socket(rawsd); -#ifndef WIN32 - sethdrinclude(rawsd); -#endif + rawsd = nmap_raw_socket(targets[0]->deviceName()); ethsd = NULL; }