------------------------------------------------------------ revno: 11756 revision-id: squid3@treenet.co.nz-20130128095918-xca1hon2x4kz22f3 parent: squid3@treenet.co.nz-20130128095816-0vl26fbidsnqb2uc committer: Amos Jeffries branch nick: 3.2 timestamp: Mon 2013-01-28 02:59:18 -0700 message: 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. ------------------------------------------------------------ # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: squid3@treenet.co.nz-20130128095918-xca1hon2x4kz22f3 # target_branch: http://bzr.squid-cache.org/bzr/squid3/branches\ # /SQUID_3_2 # testament_sha1: d2920481c7fcc574813b51121d6870356659dc98 # timestamp: 2013-01-28 10:02:02 +0000 # source_branch: http://bzr.squid-cache.org/bzr/squid3/branches\ # /SQUID_3_2 # base_revision_id: squid3@treenet.co.nz-20130128095816-\ # 0vl26fbidsnqb2uc # # Begin patch === modified file 'src/icmp/Icmp4.cc' --- src/icmp/Icmp4.cc 2012-07-28 05:38:50 +0000 +++ src/icmp/Icmp4.cc 2013-01-28 09:59:18 +0000 @@ -156,6 +156,7 @@ } Log(to, ' ', NULL, 0, 0); + to.FreeAddrInfo(S); } void @@ -221,11 +222,15 @@ 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 @@ 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 */ === modified file 'src/icmp/Icmp6.cc' --- src/icmp/Icmp6.cc 2012-07-28 05:38:50 +0000 +++ src/icmp/Icmp6.cc 2013-01-28 09:59:18 +0000 @@ -202,6 +202,7 @@ debugs(42,9, HERE << "x=" << x); Log(to, 0, NULL, 0, 0); + to.FreeAddrInfo(S); } /** @@ -296,11 +297,13 @@ ( 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 @@ /* 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 */