From b3bd13d45f67d3d2d8f19173b32d7e1920e30eb9 Mon Sep 17 00:00:00 2001 From: "Nicholas J. Kain" Date: Wed, 18 Feb 2015 11:02:13 -0500 Subject: [PATCH] Fix the return values of dhcp_packet_get and arp_packet_get. This corrects a bug where stale dhcp packets would get reprocessed, causing very bad behavior; an issue that was introduced in the coroutine conversion. --- src/arp.c | 12 ++++++------ src/arp.h | 7 +------ src/dhcp.c | 16 ++++++++-------- src/dhcp.h | 8 ++++---- src/ndhc.c | 4 ++-- src/state.c | 4 ++-- src/state.h | 4 ++-- 7 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/arp.c b/src/arp.c index 9f351c9..3875fa1 100644 --- a/src/arp.c +++ b/src/arp.c @@ -674,14 +674,14 @@ server_is_router: return ARPR_OK; } -int arp_packet_get(struct client_state_t cs[static 1]) +bool arp_packet_get(struct client_state_t cs[static 1]) { ssize_t r = 0; if (garp.reply_offset < sizeof garp.reply) { r = safe_read(cs->arpFd, (char *)&garp.reply + garp.reply_offset, sizeof garp.reply - garp.reply_offset); if (r == 0) - return ARPP_NONE; + return false; if (r < 0) { log_error("%s: (%s) ARP response read failed: %s", client_config.interface, __func__, strerror(errno)); @@ -690,13 +690,13 @@ int arp_packet_get(struct client_state_t cs[static 1]) if (arp_open_fd(cs, cs->arp_is_defense) < 0) suicide("%s: (%s) Failed to reopen ARP fd: %s", client_config.interface, __func__, strerror(errno)); - return ARPP_NONE; + return false; } garp.reply_offset += (size_t)r; } if (garp.reply_offset < ARP_MSG_SIZE) - return ARPP_NONE; + return false; // Emulate the BPF filters if they are not in use. if (!garp.using_bpf && @@ -704,9 +704,9 @@ int arp_packet_get(struct client_state_t cs[static 1]) (cs->arp_is_defense && !arp_validate_bpf_defense(cs, &garp.reply)))) { arp_reply_clear(); - return ARPP_NONE; + return false; } - return ARPP_HAVE; + return true; } // XXX: Move into client_state diff --git a/src/arp.h b/src/arp.h index ba2c477..25966ca 100644 --- a/src/arp.h +++ b/src/arp.h @@ -104,7 +104,7 @@ struct arp_data { void arp_reply_clear(void); -int arp_packet_get(struct client_state_t cs[static 1]); +bool arp_packet_get(struct client_state_t cs[static 1]); void set_arp_relentless_def(bool v); void arp_reset_send_stats(void); @@ -134,11 +134,6 @@ int arp_gw_check_timeout(struct client_state_t cs[static 1], long long nowts); #define ARPR_FAIL -2 -// There is no new packet. -#define ARPP_NONE 0 -// We have a pending packet. -#define ARPP_HAVE 1 - long long arp_get_wake_ts(void); #endif /* ARP_H_ */ diff --git a/src/dhcp.c b/src/dhcp.c index 908ef91..00111fe 100644 --- a/src/dhcp.c +++ b/src/dhcp.c @@ -380,13 +380,13 @@ static int validate_dhcp_packet(struct client_state_t cs[static 1], return 1; } -int dhcp_packet_get(struct client_state_t cs[static 1], - struct dhcpmsg packet[static 1], - uint8_t msgtype[static 1], - uint32_t srcaddr[static 1]) +bool dhcp_packet_get(struct client_state_t cs[static 1], + struct dhcpmsg packet[static 1], + uint8_t msgtype[static 1], + uint32_t srcaddr[static 1]) { if (cs->listenFd < 0) - return -1; + return false; ssize_t r = get_raw_packet(cs, packet, srcaddr); if (r < 0) { // Not a transient issue handled by packet collection functions. @@ -396,11 +396,11 @@ int dhcp_packet_get(struct client_state_t cs[static 1], stop_dhcp_listen(cs); start_dhcp_listen(cs); } - return -1; + return false; } if (!validate_dhcp_packet(cs, (size_t)r, packet, msgtype)) - return -1; - return 0; + return false; + return true; } // Initialize a DHCP client packet that will be sent to a server diff --git a/src/dhcp.h b/src/dhcp.h index 15ae7b4..6ce8211 100644 --- a/src/dhcp.h +++ b/src/dhcp.h @@ -83,10 +83,10 @@ struct udp_dhcp_packet { void start_dhcp_listen(struct client_state_t cs[static 1]); void stop_dhcp_listen(struct client_state_t cs[static 1]); -int dhcp_packet_get(struct client_state_t cs[static 1], - struct dhcpmsg packet[static 1], - uint8_t msgtype[static 1], - uint32_t srcaddr[static 1]); +bool dhcp_packet_get(struct client_state_t cs[static 1], + struct dhcpmsg packet[static 1], + uint8_t msgtype[static 1], + uint32_t srcaddr[static 1]); ssize_t send_discover(struct client_state_t cs[static 1]); ssize_t send_selecting(struct client_state_t cs[static 1]); ssize_t send_renew(struct client_state_t cs[static 1]); diff --git a/src/ndhc.c b/src/ndhc.c index 1d4e5bc..6c036b5 100644 --- a/src/ndhc.c +++ b/src/ndhc.c @@ -292,10 +292,10 @@ static void do_ndhc_work(void) else suicide("epoll_wait failed"); } - int sev_dhcp = -1; + bool sev_dhcp = false; uint32_t dhcp_srcaddr; uint8_t dhcp_msgtype; - int sev_arp = ARPP_NONE; + bool sev_arp = false; int sev_nl = IFS_NONE; int sev_rfk = RFK_NONE; int sev_signal = SIGNAL_NONE; diff --git a/src/state.c b/src/state.c index 675ec97..32f45bf 100644 --- a/src/state.c +++ b/src/state.c @@ -437,8 +437,8 @@ static int ifup_action(struct client_state_t cs[static 1]) // XXX: Should be re-entrant so as to handle multiple servers. int dhcp_handle(struct client_state_t cs[static 1], long long nowts, - int sev_dhcp, struct dhcpmsg dhcp_packet[static 1], - uint8_t dhcp_msgtype, uint32_t dhcp_srcaddr, int sev_arp, + bool sev_dhcp, struct dhcpmsg dhcp_packet[static 1], + uint8_t dhcp_msgtype, uint32_t dhcp_srcaddr, bool sev_arp, bool force_fingerprint, bool dhcp_timeout, bool arp_timeout, int sev_signal) { diff --git a/src/state.h b/src/state.h index b5fa4b7..b5c8bb4 100644 --- a/src/state.h +++ b/src/state.h @@ -41,8 +41,8 @@ enum { }; int dhcp_handle(struct client_state_t cs[static 1], long long nowts, - int sev_dhcp, struct dhcpmsg dhcp_packet[static 1], - uint8_t dhcp_msgtype, uint32_t dhcp_srcaddr, int sev_arp, + bool sev_dhcp, struct dhcpmsg dhcp_packet[static 1], + uint8_t dhcp_msgtype, uint32_t dhcp_srcaddr, bool sev_arp, bool force_fingerprint, bool dhcp_timeout, bool arp_timeout, int sev_signal);