Просмотр исходного кода

check_dhcp: Fix handling of "pad" options

Don't let "pad" options[*] terminate the parsing of DHCP options.  This
bug was triggered by using check_dhcp against Windows 2003 DHCP servers
(see #3503921).

[*] Cf. RFC 2132, 3.1.
Holger Weiss 13 лет назад
Родитель
Сommit
f091d59e0f
2 измененных файлов с 5 добавлено и 3 удалено
  1. 1 0
      NEWS
  2. 4 3
      plugins-root/check_dhcp.c

+ 1 - 0
NEWS

@@ -24,6 +24,7 @@ This file documents the major additions and syntax changes between releases.
 	Fix segfault in check_host when hostname returns multiple IP addresses (Sebastian Harl)
 	Fix segfault in check_host when hostname returns multiple IP addresses (Sebastian Harl)
 	Fix check_smtp and check_tcp where duplicate messages were displayed for certificate errors
 	Fix check_smtp and check_tcp where duplicate messages were displayed for certificate errors
 	Fix check_ping's parsing of the output of Debian's ping6(1) implementation (#1894850 - Matej Vela)
 	Fix check_ping's parsing of the output of Debian's ping6(1) implementation (#1894850 - Matej Vela)
+	Fix a check_dhcp bug which was triggered by using it to check Windows 2003 DHCP servers (#3503921)
 	Disable RFC4507 support, to work around SSL negotiation issues with (at least) some Tomcat versions
 	Disable RFC4507 support, to work around SSL negotiation issues with (at least) some Tomcat versions
 
 
 1.4.15 27th July 2010
 1.4.15 27th July 2010

+ 4 - 3
plugins-root/check_dhcp.c

@@ -839,8 +839,7 @@ int add_dhcp_offer(struct in_addr source,dhcp_packet *offer_packet){
 	/* process all DHCP options present in the packet */
 	/* process all DHCP options present in the packet */
 	for(x=4;x<MAX_DHCP_OPTIONS_LENGTH;){
 	for(x=4;x<MAX_DHCP_OPTIONS_LENGTH;){
 
 
-		/* end of options (0 is really just a pad, but bail out anyway) */
-		if((int)offer_packet->options[x]==-1 || (int)offer_packet->options[x]==0)
+		if((int)offer_packet->options[x]==-1)
 			break;
 			break;
 
 
 		/* get option type */
 		/* get option type */
@@ -872,7 +871,9 @@ int add_dhcp_offer(struct in_addr source,dhcp_packet *offer_packet){
 			}
 			}
 
 
 		/* skip option data we're ignoring */
 		/* skip option data we're ignoring */
-		if(option_type!=DHCP_OPTION_REBINDING_TIME)
+		if(option_type==0) /* "pad" option, see RFC 2132 (3.1) */
+			x+=1;
+		else
 			x+=option_length;
 			x+=option_length;
 		}
 		}