From: Amos Jeffries Date: Wed, 9 Jan 2013 00:19:44 +0000 (-0700) Subject: Fix memory leaks in ICMP X-Git-Tag: SQUID_3_3_0_3~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b75495046710ddce003f42a783b9aa1da28d9801;p=thirdparty%2Fsquid.git 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. --- diff --git a/src/icmp/Icmp4.cc b/src/icmp/Icmp4.cc index 6336642960..0273c56ca4 100644 --- a/src/icmp/Icmp4.cc +++ b/src/icmp/Icmp4.cc @@ -155,6 +155,7 @@ Icmp4::SendEcho(Ip::Address &to, int opcode, const char *payload, int len) } Log(to, ' ', NULL, 0, 0); + to.FreeAddrInfo(S); } void @@ -220,11 +221,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); @@ -241,6 +246,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 6875834504..da04c963a6 100644 --- a/src/icmp/Icmp6.cc +++ b/src/icmp/Icmp6.cc @@ -200,6 +200,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); } /** @@ -293,11 +294,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; } @@ -334,6 +337,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 */