From 879c06a7c4c60db633f51ded05c280677d5dac36 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Mon, 28 Jan 2013 02:59:18 -0700 Subject: [PATCH] Fix memory leaks in ICMP InitAddrInfo() and GetAddrInfo() both allocate addrinfo structs which must be freed by FreeAddrInfo(). Several places in ICMP were not doing that free step. Detected by Coverity Scan. Issues 740434, 740435, 740436, 740437. --- src/icmp/Icmp4.cc | 10 ++++++++-- src/icmp/Icmp6.cc | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/icmp/Icmp4.cc b/src/icmp/Icmp4.cc index 2aa7a57a09..ffb3c3de73 100644 --- a/src/icmp/Icmp4.cc +++ b/src/icmp/Icmp4.cc @@ -156,6 +156,7 @@ Icmp4::SendEcho(Ip::Address &to, int opcode, const char *payload, int len) } Log(to, ' ', NULL, 0, 0); + to.FreeAddrInfo(S); } void @@ -221,11 +222,15 @@ Icmp4::Recv(void) icmp = (struct icmphdr *) (void *) (pkt + iphdrlen); - if (icmp->icmp_type != ICMP_ECHOREPLY) + if (icmp->icmp_type != ICMP_ECHOREPLY) { + preply.from.FreeAddrInfo(from); return; + } - if (icmp->icmp_id != icmp_ident) + if (icmp->icmp_id != icmp_ident) { + preply.from.FreeAddrInfo(from); return; + } echo = (icmpEchoData *) (void *) (icmp + 1); @@ -242,6 +247,7 @@ Icmp4::Recv(void) control.SendResult(preply, (sizeof(pingerReplyData) - MAX_PKT4_SZ + preply.psize) ); Log(preply.from, icmp->icmp_type, icmpPktStr[icmp->icmp_type], preply.rtt, preply.hops); + preply.from.FreeAddrInfo(from); } #endif /* USE_ICMP */ diff --git a/src/icmp/Icmp6.cc b/src/icmp/Icmp6.cc index 206df2c896..5738e79d5d 100644 --- a/src/icmp/Icmp6.cc +++ b/src/icmp/Icmp6.cc @@ -202,6 +202,7 @@ Icmp6::SendEcho(Ip::Address &to, int opcode, const char *payload, int len) debugs(42,9, HERE << "x=" << x); Log(to, 0, NULL, 0, 0); + to.FreeAddrInfo(S); } /** @@ -296,11 +297,13 @@ Icmp6::Recv(void) ( icmp6header->icmp6_type&0x80 ? icmp6HighPktStr[(int)(icmp6header->icmp6_type&0x7f)] : icmp6LowPktStr[(int)(icmp6header->icmp6_type&0x7f)] ) ); } + preply.from.FreeAddrInfo(from); return; } if (icmp6header->icmp6_id != icmp_ident) { debugs(42, 8, HERE << "dropping Icmp6 read. IDENT check failed. ident=='" << icmp_ident << "'=='" << icmp6header->icmp6_id << "'"); + preply.from.FreeAddrInfo(from); return; } @@ -337,6 +340,7 @@ Icmp6::Recv(void) /* send results of the lookup back to squid.*/ control.SendResult(preply, (sizeof(pingerReplyData) - PINGER_PAYLOAD_SZ + preply.psize) ); + preply.from.FreeAddrInfo(from); } #endif /* USE_ICMP */ -- 2.47.2