monitoring-plugins' check_dhcp has some weird in a counter:
$ doas /usr/local/libexec/nagios/check_dhcp -s 10.17.11.55 -u -i bnx0
OK: Received 260350 DHCPOFFER(s), 1 of 1 requested servers responded, max lease 
time = 21600 sec.

This is caused by receive_dhcp_packet, which only does
recvfrom(MSG_PEEK), which causes the packet to be found as long as the
timer hasn't expired. The diff below removes the MSG_PEEK flag and
returns the correct value:
$ doas ./check_dhcp -s 10.17.11.55 -u -i trunk0
OK: Received 1 DHCPOFFER(s), 1 of 1 requested servers responded, max lease time 
= 21600 sec.

OK?

martijn@

Index: patches/patch-plugins-root_check_dhcp_c
===================================================================
RCS file: 
/cvs/ports/net/monitoring-plugins/patches/patch-plugins-root_check_dhcp_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-plugins-root_check_dhcp_c
--- patches/patch-plugins-root_check_dhcp_c     19 Jul 2017 12:14:29 -0000      
1.1
+++ patches/patch-plugins-root_check_dhcp_c     9 Jan 2019 16:00:36 -0000
@@ -3,8 +3,11 @@ Fix stack smashing.
 
 Upstream merge request:
 https://github.com/monitoring-plugins/monitoring-plugins/pull/1500
---- plugins-root/check_dhcp.c.orig     Wed Jul 19 12:53:55 2017
-+++ plugins-root/check_dhcp.c  Wed Jul 19 13:46:40 2017
+
+MSG_PEEK causes the packet to be counted multiple times.
+Index: plugins-root/check_dhcp.c
+--- plugins-root/check_dhcp.c.orig
++++ plugins-root/check_dhcp.c
 @@ -323,7 +323,8 @@ int get_hardware_address(int sock,char *interface_name
  #elif defined(__bsd__)
                                                /* King 2004    see 
ACKNOWLEDGEMENTS */
@@ -15,3 +18,12 @@ https://github.com/monitoring-plugins/mo
          char                    *buf;
          unsigned char           *ptr;
          struct if_msghdr        *ifm;
+@@ -693,7 +694,7 @@ int receive_dhcp_packet(void *buffer, int buffer_size,
+         else{
+               bzero(&source_address,sizeof(source_address));
+               address_size=sizeof(source_address);
+-                recv_result=recvfrom(sock,(char 
*)buffer,buffer_size,MSG_PEEK,(struct sockaddr *)&source_address,&address_size);
++                recv_result=recvfrom(sock,(char 
*)buffer,buffer_size,0,(struct sockaddr *)&source_address,&address_size);
+               if(verbose)
+                       printf("recv_result: %d\n",recv_result);
+ 

Reply via email to