diff options
Diffstat (limited to 'plugins-root/check_dhcp.c')
-rw-r--r-- | plugins-root/check_dhcp.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/plugins-root/check_dhcp.c b/plugins-root/check_dhcp.c index 2a1875c..b02ee49 100644 --- a/plugins-root/check_dhcp.c +++ b/plugins-root/check_dhcp.c | |||
@@ -141,7 +141,7 @@ typedef struct dhcp_packet_struct{ | |||
141 | u_int16_t flags; /* flags */ | 141 | u_int16_t flags; /* flags */ |
142 | struct in_addr ciaddr; /* IP address of this machine (if we already have one) */ | 142 | struct in_addr ciaddr; /* IP address of this machine (if we already have one) */ |
143 | struct in_addr yiaddr; /* IP address of this machine (offered by the DHCP server) */ | 143 | struct in_addr yiaddr; /* IP address of this machine (offered by the DHCP server) */ |
144 | struct in_addr siaddr; /* IP address of DHCP server */ | 144 | struct in_addr siaddr; /* IP address of next server */ |
145 | struct in_addr giaddr; /* IP address of DHCP relay */ | 145 | struct in_addr giaddr; /* IP address of DHCP relay */ |
146 | unsigned char chaddr [MAX_DHCP_CHADDR_LENGTH]; /* hardware address of this machine */ | 146 | unsigned char chaddr [MAX_DHCP_CHADDR_LENGTH]; /* hardware address of this machine */ |
147 | char sname [MAX_DHCP_SNAME_LENGTH]; /* name of DHCP server */ | 147 | char sname [MAX_DHCP_SNAME_LENGTH]; /* name of DHCP server */ |
@@ -587,11 +587,6 @@ int get_dhcp_offer(int sock){ | |||
587 | /* Save a copy of "source" into "via" even if it's via itself */ | 587 | /* Save a copy of "source" into "via" even if it's via itself */ |
588 | memcpy(&via,&source,sizeof(source)) ; | 588 | memcpy(&via,&source,sizeof(source)) ; |
589 | 589 | ||
590 | /* If siaddr is non-zero, set "source" to siaddr */ | ||
591 | if(offer_packet.siaddr.s_addr != 0L){ | ||
592 | source.sin_addr.s_addr = offer_packet.siaddr.s_addr ; | ||
593 | } | ||
594 | |||
595 | if(verbose){ | 590 | if(verbose){ |
596 | printf(_("DHCPOFFER from IP address %s"),inet_ntoa(source.sin_addr)); | 591 | printf(_("DHCPOFFER from IP address %s"),inet_ntoa(source.sin_addr)); |
597 | printf(_(" via %s\n"),inet_ntoa(via.sin_addr)); | 592 | printf(_(" via %s\n"),inet_ntoa(via.sin_addr)); |
@@ -839,8 +834,7 @@ int add_dhcp_offer(struct in_addr source,dhcp_packet *offer_packet){ | |||
839 | /* process all DHCP options present in the packet */ | 834 | /* process all DHCP options present in the packet */ |
840 | for(x=4;x<MAX_DHCP_OPTIONS_LENGTH;){ | 835 | for(x=4;x<MAX_DHCP_OPTIONS_LENGTH;){ |
841 | 836 | ||
842 | /* end of options (0 is really just a pad, but bail out anyway) */ | 837 | if((int)offer_packet->options[x]==-1) |
843 | if((int)offer_packet->options[x]==-1 || (int)offer_packet->options[x]==0) | ||
844 | break; | 838 | break; |
845 | 839 | ||
846 | /* get option type */ | 840 | /* get option type */ |
@@ -872,7 +866,9 @@ int add_dhcp_offer(struct in_addr source,dhcp_packet *offer_packet){ | |||
872 | } | 866 | } |
873 | 867 | ||
874 | /* skip option data we're ignoring */ | 868 | /* skip option data we're ignoring */ |
875 | if(option_type!=DHCP_OPTION_REBINDING_TIME) | 869 | if(option_type==0) /* "pad" option, see RFC 2132 (3.1) */ |
870 | x+=1; | ||
871 | else | ||
876 | x+=option_length; | 872 | x+=option_length; |
877 | } | 873 | } |
878 | 874 | ||
@@ -903,9 +899,9 @@ int add_dhcp_offer(struct in_addr source,dhcp_packet *offer_packet){ | |||
903 | * the next bootstrap service (e.g., delivery of an operating system | 899 | * the next bootstrap service (e.g., delivery of an operating system |
904 | * executable image). A DHCP server always returns its own address in | 900 | * executable image). A DHCP server always returns its own address in |
905 | * the 'server identifier' option." 'serv_ident' is the 'server | 901 | * the 'server identifier' option." 'serv_ident' is the 'server |
906 | * identifier' option, 'source' is the 'siaddr' field or (if 'siaddr' | 902 | * identifier' option, 'source' is the IP address we received the |
907 | * wasn't available) the IP address we received the DHCPOFFER from. If | 903 | * DHCPOFFER from. If 'serv_ident' isn't available for some reason, we |
908 | * 'serv_ident' isn't available for some reason, we use 'source'. | 904 | * use 'source'. |
909 | */ | 905 | */ |
910 | new_offer->server_address=serv_ident.s_addr?serv_ident:source; | 906 | new_offer->server_address=serv_ident.s_addr?serv_ident:source; |
911 | new_offer->offered_address=offer_packet->yiaddr; | 907 | new_offer->offered_address=offer_packet->yiaddr; |