summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRincewindsHat <12514511+RincewindsHat@users.noreply.github.com>2021-12-03 01:06:46 +0100
committerRincewindsHat <12514511+RincewindsHat@users.noreply.github.com>2022-03-15 21:02:27 +0100
commitc842543e03cb629bed7459c5b9d48d30eae63087 (patch)
tree2d76830b31e276dad2cb7c4569268e5ae50d7e8a
parent5943528121033579033c5a372df6c5e91b22e723 (diff)
downloadmonitoring-plugins-c842543.tar.gz
Fix different overflows
-rw-r--r--plugins-root/check_icmp.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
index f97b0ed7..df0d3c13 100644
--- a/plugins-root/check_icmp.c
+++ b/plugins-root/check_icmp.c
@@ -207,7 +207,7 @@ static int add_target(char *);
207static int add_target_ip(char *, struct sockaddr_storage *); 207static int add_target_ip(char *, struct sockaddr_storage *);
208static int handle_random_icmp(unsigned char *, struct sockaddr_storage *); 208static int handle_random_icmp(unsigned char *, struct sockaddr_storage *);
209static void parse_address(struct sockaddr_storage *, char *, int); 209static void parse_address(struct sockaddr_storage *, char *, int);
210static unsigned short icmp_checksum(unsigned short *, int); 210static unsigned short icmp_checksum(uint16_t *, size_t);
211static void finish(int); 211static void finish(int);
212static void crash(const char *, ...); 212static void crash(const char *, ...);
213 213
@@ -779,7 +779,7 @@ static int
779wait_for_reply(int sock, u_int t) 779wait_for_reply(int sock, u_int t)
780{ 780{
781 int n, hlen; 781 int n, hlen;
782 static unsigned char buf[4096]; 782 static unsigned char buf[65536];
783 struct sockaddr_storage resp_addr; 783 struct sockaddr_storage resp_addr;
784 union ip_hdr *ip; 784 union ip_hdr *ip;
785 union icmp_packet packet; 785 union icmp_packet packet;
@@ -916,9 +916,27 @@ wait_for_reply(int sock, u_int t)
916 if(debug) { 916 if(debug) {
917 char address[INET6_ADDRSTRLEN]; 917 char address[INET6_ADDRSTRLEN];
918 parse_address(&resp_addr, address, sizeof(address)); 918 parse_address(&resp_addr, address, sizeof(address));
919 printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n", 919
920 (float)tdiff / 1000, address, 920 switch(address_family) {
921 ttl, ip->ip.ip_ttl, (float)host->rtmax / 1000, (float)host->rtmin / 1000); 921 case AF_INET: {
922 printf("%0.3f ms rtt from %s, outgoing ttl: %u, incoming ttl: %u, max: %0.3f, min: %0.3f\n",
923 (float)tdiff / 1000,
924 address,
925 ttl,
926 ip->ip.ip_ttl,
927 (float)host->rtmax / 1000,
928 (float)host->rtmin / 1000);
929 break;
930 };
931 case AF_INET6: {
932 printf("%0.3f ms rtt from %s, outgoing ttl: %u, max: %0.3f, min: %0.3f\n",
933 (float)tdiff / 1000,
934 address,
935 ttl,
936 (float)host->rtmax / 1000,
937 (float)host->rtmin / 1000);
938 };
939 }
922 } 940 }
923 941
924 /* if we're in hostcheck mode, exit with limited printouts */ 942 /* if we're in hostcheck mode, exit with limited printouts */
@@ -980,7 +998,7 @@ send_icmp_ping(int sock, struct rta_host *host)
980 icp->icmp_cksum = 0; 998 icp->icmp_cksum = 0;
981 icp->icmp_id = htons(pid); 999 icp->icmp_id = htons(pid);
982 icp->icmp_seq = htons(host->id++); 1000 icp->icmp_seq = htons(host->id++);
983 icp->icmp_cksum = icmp_checksum((unsigned short*)buf, icmp_pkt_size); 1001 icp->icmp_cksum = icmp_checksum((uint16_t*)buf, (size_t)icmp_pkt_size);
984 1002
985 if (debug > 2) 1003 if (debug > 2)
986 printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n", 1004 printf("Sending ICMP echo-request of len %lu, id %u, seq %u, cksum 0x%X to host %s\n",
@@ -1517,18 +1535,19 @@ get_threshold(char *str, threshold *th)
1517} 1535}
1518 1536
1519unsigned short 1537unsigned short
1520icmp_checksum(unsigned short *p, int n) 1538icmp_checksum(uint16_t *p, size_t n)
1521{ 1539{
1522 unsigned short cksum; 1540 unsigned short cksum;
1523 long sum = 0; 1541 long sum = 0;
1524 1542
1525 while(n > 2) { 1543 /* sizeof(uint16_t) == 2 */
1526 sum += *p++; 1544 while(n >= 2) {
1527 n -= sizeof(unsigned short); 1545 sum += *(p++);
1546 n -= 2;
1528 } 1547 }
1529 1548
1530 /* mop up the occasional odd byte */ 1549 /* mop up the occasional odd byte */
1531 if(n == 1) sum += (unsigned char)*p; 1550 if(n == 1) sum += *((uint8_t *)p -1);
1532 1551
1533 sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ 1552 sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
1534 sum += (sum >> 16); /* add carry */ 1553 sum += (sum >> 16); /* add carry */