From 5b78ef236e826f24fab4464094bd4cca0a3a502e Mon Sep 17 00:00:00 2001 From: dmiller Date: Tue, 10 Mar 2026 18:32:50 +0000 Subject: [PATCH] Gracefully handle arp_open failure --- nping/NpingTarget.cc | 21 +++++++++++++-------- tcpip.cc | 14 ++++++++------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/nping/NpingTarget.cc b/nping/NpingTarget.cc index fee78246f..34abef648 100644 --- a/nping/NpingTarget.cc +++ b/nping/NpingTarget.cc @@ -769,16 +769,21 @@ bool NpingTarget::determineNextHopMACAddress() { /* Maybe the system ARP cache will be more helpful */ nping_print(DBG_3," > Checking system's ARP cache..."); a = arp_open(); - addr_ston((sockaddr *)&targetss, &ae.arp_pa); - if (arp_get(a, &ae) == 0) { - mac_cache_set(&targetss, ae.arp_ha.addr_eth.data); - this->setNextHopMACAddress(ae.arp_ha.addr_eth.data); + if (a) { + addr_ston((sockaddr *)&targetss, &ae.arp_pa); + if (arp_get(a, &ae) == 0) { + mac_cache_set(&targetss, ae.arp_ha.addr_eth.data); + this->setNextHopMACAddress(ae.arp_ha.addr_eth.data); + arp_close(a); + nping_print(DBG_3," > Success: Entry found [%s]", this->getNextHopMACStr() ); + return true; + } arp_close(a); - nping_print(DBG_3," > Success: Entry found [%s]", this->getNextHopMACStr() ); - return true; + nping_print(DBG_3," > No relevant entries found in system's ARP cache."); + } + else { + nping_print(DBG_3," > Failed to open system's ARP cache."); } - arp_close(a); - nping_print(DBG_3," > No relevant entries found in system's ARP cache."); /* OK, the last choice is to send our own damn ARP request (and diff --git a/tcpip.cc b/tcpip.cc index 280a60be3..81243de1d 100644 --- a/tcpip.cc +++ b/tcpip.cc @@ -1663,14 +1663,16 @@ bool getNextHopMAC(const char *iface, const u8 *srcmac, const struct sockaddr_st /* Maybe the system ARP cache will be more helpful */ a = arp_open(); - addr_ston((sockaddr *) dstss, &ae.arp_pa); - if (arp_get(a, &ae) == 0) { - mac_cache_set(dstss, ae.arp_ha.addr_eth.data); - memcpy(dstmac, ae.arp_ha.addr_eth.data, 6); + if (a) { + addr_ston((sockaddr *) dstss, &ae.arp_pa); + if (arp_get(a, &ae) == 0) { + mac_cache_set(dstss, ae.arp_ha.addr_eth.data); + memcpy(dstmac, ae.arp_ha.addr_eth.data, 6); + arp_close(a); + return true; + } arp_close(a); - return true; } - arp_close(a); /* OK, the last choice is to send our own damn ARP request (and retransmissions if necessary) to determine the MAC */