Fix memory leak in Linux builds.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: file:///src/squid/bzr/trunk/
# testament_sha1: 17d43699f1813e00a034e95f491c5dbb84d791c3
# timestamp: 2008-03-23 23:19:37 +1200
# base_revision_id: [EMAIL PROTECTED]
#   bsyr7gm4440gm4s1
# 
# Begin patch
=== modified file 'include/IPAddress.h'
--- include/IPAddress.h	2008-03-20 11:30:19 +0000
+++ include/IPAddress.h	2008-03-22 23:26:24 +0000
@@ -123,17 +123,13 @@
     /[EMAIL PROTECTED]/
     IPAddress& operator =(const IPAddress &s);
     IPAddress& operator =(IPAddress *s);
-
     IPAddress& operator =(struct sockaddr_in const &s);
-
+    IPAddress& operator =(struct sockaddr_storage const &s);
     IPAddress& operator =(struct in_addr const &s);
 #if USE_IPV6
-
     IPAddress& operator =(struct in6_addr const &s);
-
     IPAddress& operator =(struct sockaddr_in6 const &s);
 #endif
-
     bool operator =(const struct hostent &s);
     bool operator =(const struct addrinfo &s);
     bool operator =(const char *s);
@@ -359,6 +355,8 @@
      * these functiosn WILL NOT be in the final public API after transition.
      */
 
+    void GetSockAddr(struct sockaddr_storage &addr, const int family) const;
+
     /// \deprecated Deprecated for public use. Use IPAddress::GetAddrInfo()
     void GetSockAddr(struct sockaddr_in &) const;
 

=== modified file 'lib/IPAddress.cc'
--- lib/IPAddress.cc	2008-02-15 16:45:57 +0000
+++ lib/IPAddress.cc	2008-03-22 23:26:24 +0000
@@ -557,6 +557,24 @@
     return *this;
 };
 
+IPAddress& IPAddress::operator =(const sockaddr_storage &s)
+{
+#if USE_IPV6
+    /* some AF_* magic to tell socket types apart and what we need to do */
+    if(s.ss_family == AF_INET6) {
+        memcpy(&m_SocketAddr, &s, sizeof(struct sockaddr_in));
+    }
+    else { // convert it to our storage mapping.
+        struct sockaddr_in *sin = (struct sockaddr_in*)&s;
+        m_SocketAddr.sin6_port = sin->sin_port;
+        Map4to6( sin->sin_addr, m_SocketAddr.sin6_addr);
+    }
+#else
+    memcpy(&m_SocketAddr, &s, sizeof(struct sockaddr_in));
+#endif
+    return *this;
+};
+
 void IPAddress::check4Mapped()
 {
   // obsolete.
@@ -1065,6 +1083,36 @@
     return buf;
 }
 
+void IPAddress::GetSockAddr(struct sockaddr_storage &addr, const int family) const
+{
+    if( family == AF_INET && !IsIPv4()) {
+        // FIXME INET6: caller using the wrong socket type!
+        debugs(14, DBG_CRITICAL, HERE << "IPAddress::GetSockAddr : Cannot convert non-IPv4 to IPv4. from " << *this);
+        assert(false);
+    }
+
+#if USE_IPV6
+    if( IsIPv6() ) {
+        memcpy(&addr, &m_SocketAddr, sizeof(struct sockaddr_in6));
+
+        if(addr.ss_family == 0)
+            addr.ss_family = AF_INET6;
+    }
+    else if( IsIPv4() ) {
+        struct sockaddr_in *sin = (struct sockaddr_in*)&addr;
+        addr.ss_family = AF_INET;
+        sin->sin_port = m_SocketAddr.sin6_port;
+        Map6to4( m_SocketAddr.sin6_addr, sin->sin_addr);
+    }
+#else
+    struct sockaddr_in *sa = (struct sockaddr_in*)&addr;
+    memcpy(&addr, &m_SocketAddr, sizeof(struct sockaddr_in));
+
+    if(addr.sa_family == 0)
+        addr.sa_family = AF_INET;
+#endif
+}
+
 void IPAddress::GetSockAddr(struct sockaddr_in &buf) const
 {
 #if USE_IPV6

=== modified file 'src/comm.cc'
--- src/comm.cc	2008-02-27 04:49:32 +0000
+++ src/comm.cc	2008-03-23 10:39:43 +0000
@@ -1133,15 +1133,16 @@
     int x = 0;
     int err = 0;
     socklen_t errlen;
-    struct addrinfo *AI = NULL;
+    struct sockaddr_storage sas;
+    socklen_t slen = sizeof(struct sockaddr_storage);
     PROF_start(comm_connect_addr);
 
     assert(address.GetPort() != 0);
 
     debugs(5, 9, "comm_connect_addr: connecting socket " << sock << " to " << address << " (want family: " << F->sock_family << ")");
 
-    /* FIXME INET6 : Bug 2222: when sock is an IPv4-only socket IPv6 traffic will crash. */
-    address.GetAddrInfo(AI, F->sock_family);
+    memset(&sas, NULL, slen);
+    address.GetSockAddr(sas, F->sock_family);
 
     /* Establish connection. */
     errno = 0;
@@ -1151,7 +1152,7 @@
         F->flags.called_connect = 1;
         statCounter.syscalls.sock.connects++;
 
-        x = connect(sock, AI->ai_addr, AI->ai_addrlen);
+        x = connect(sock, (struct sockaddr*)&sas, slen);
 
         // XXX: ICAP code refuses callbacks during a pending comm_ call
         // Async calls development will fix this.
@@ -1163,12 +1164,8 @@
         if (x < 0)
         {
             debugs(5,5, "comm_connect_addr: sock=" << sock << ", addrinfo( " <<
-                         " flags=" << AI->ai_flags <<
-                         ", family=" << AI->ai_family <<
-                         ", socktype=" << AI->ai_socktype <<
-                         ", protocol=" << AI->ai_protocol <<
-                         ", &addr=" << AI->ai_addr <<
-                         ", addrlen=" << AI->ai_addrlen <<
+                         ", family=" << sas.ss_family <<
+                         ", addrlen=" << slen <<
                          " )" );
             debugs(5, 9, "connect FD " << sock << ": (" << x << ") " << xstrerror());
             debugs(14,9, "connecting to: " << address );
@@ -1178,7 +1175,7 @@
 #if defined(_SQUID_NEWSOS6_)
         /* Makoto MATSUSHITA <[EMAIL PROTECTED]> */
 
-        connect(sock, AI->ai_addr, AI->ai_addrlen);
+        connect(sock, (struct sockaddr*)&sas, slen);
 
         if (errno == EINVAL) {
             errlen = sizeof(err);
@@ -1211,20 +1208,6 @@
 
     }
 
-#ifdef _SQUID_LINUX_
-    /* 2007-11-27:
-     * Linux Debian replaces our allocated AI pointer with garbage when 
-     * connect() fails. This leads to segmentation faults deallocating
-     * the system-allocated memory when we go to clean up our pointer.
-     * HACK: is to leak the memory returned since we can't deallocate.
-     */
-    if(errno != 0) {
-        AI = NULL;
-    }
-#endif
-
-    address.FreeAddrInfo(AI);
-
     PROF_stop(comm_connect_addr);
 
     if (errno == 0 || errno == EISCONN)

# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWdE9PR8ABTp/gERQAgB59///
f/dfQL////pgCW+777eq8e9gAAa3s7mq7dOzDWgNBDJNIJiYUZPSempghhNANADQNA0aDIcAwjCa
YhgEAyAGEaZMmEYCGg0J6gp6FNNqMjQ0A0AAAAAANBoJFJqGmlPyJ5NRqenqT1PU9T1HoTT1Mg9E
B5QYg8oYIpKak9TwJtTI9Kemj0h6mTU0yZG0g9QBpowCYJJNBACaNJoGqeynoTU8pmg0ptNRo0Yg
DR6jhJA1WgErz920LF4RPm6gUqPampB8DSG3Q2pGF1QXHJavyd3IImx1sWbq3kM3CU86ryhSqozF
WhhOMeoV4tLiH21RBSWaSsgQ21N8Qm+AM3iEWgIhcFGNZwoq20Ep6sGmg7jKStyJ4OFum32NmMVS
dDgYYYm0Dcpa7QMeKi4UDk5oHC+Zu1BuLIuxxshG4yFbymhBJxezgZElRQ0GjCWCrDyVp6EFMNYd
EECisRksjDnZVpW6zlFwO3x8slDYZTHHeY8GSPtiiUOtP3XFY2DXYkIBTKxTxmAmFaORjzuQCWwo
F+UqqqmAV5cUAOhCJEn/JqsdUGb9eUCS/DDgQWdUSuUMfYAg4Ll/Fh4X3RuiI14Ru2hOGr+NJaRx
PntEuucwsoEe+gagIFpUCPeLt6CPIY5isgOMJ4MeHcsPu4h1Qfe1szCdrzccdMmcjDI0peWjX13N
yRHCLEjfRypnjeRh+3jNSLRMGhnV/VuUhmUBmH7zz7OCxmSOJEc6EIol0P3FTu1JJLBA3lOCzcrY
41JjQwZFSG8qVCg0+LEdXvxirzmkRXkpIQhv04mVTIRoagwjJWOtyEuR4Qp28kMJFQreKJp7ApVB
JF5FXkRlBzzJHpecSi9oS/HUIsZY5YOauqlhqhMU3XtgSRbBFrC7xrgZJw1tfXLHWUmxJDKAzfke
LLREgimtgRvLnsK1Bhnh8XyOOWaIMXogkMaywtGOQT13BYx0QaO58wYdITZYqClJDhjQHRBEkiCR
VKPNgkTFKaQxBEUjPA21ypDwGdIqqlGJCGEMR2QwYoYDmUUhwxoVQIQYHRmKqys2tWLcReyhmhDo
mJXwGsUNZliYRoi2ZhEdlDO0WCBZjESswV/1fugWXpEKOBRc2xwg5kaxbDMnJYHetUaKyr5cxaUR
jbSKLiBgahiZEvAh17p0IkGg2zK27EqY283oZ1RZ0bAvRYojUOcLovmZkSljEysrBjIsMiw4Ib9i
u9pNcdHR9OXSifNUkNXHhnzayVNmRsLOkrlaaFUTeMsqxNkFptGNhA6bLAfXumRtyCPlpEcxNOly
vAm1epK8wLByhvNXFR3ItZsy3O66HZOSSGhFjoRPopIqyNRkRIuWEy0lqMCTm4Y+qR6kjs0FiYXM
MFbVZMQCPUbNQslgh3LSxHHQrMwzJmOF1bepc446NpIUc0o4ozQp7Px+AHRdC1lIjCPZBoRDwF8h
+hBOMKfYgJPwCFz7uUzBRaCUtUknqrMDMYZlULtPeiwyHKiAUGIDnijgkioX6avaF8DaBKVEzGJt
nZr/Xx8Bu23P5uF/S2bRerk9riS5ogqFF79YqGjZoCpL5LnQx5v7TmE4LqEmxbtvC0BKASFPnqN4
+P/WRM+8Cv2chn0X3jHLlRhqCb7RDgPUzMT/WfrZmCgEpP6yYih8wYYkfp5HzP3+fvcxM5/QkU9H
dKUxqCGewG2UWTSXShCcIAxaFLnXL9eFDBbOc4iYo0P3Dny0pLALgjkYVTHsv01EMh8yQnNhmMRr
OA7AtmwvEpYWF468iRqNSj0iRVQ0YMz+haeAtxsOYiSN+0+gnNsz86Fx2mPKkDaJBGZJFet0Iy8u
okDlay5gnz2VIBij3chSRxvPf1mdKJI4lR1B1mJ1ForUuJwc+wtBWl9+kj6YDnaYmMGMYNJDTbGx
pmHHC+eUwlBxkQ1iSTb96Aho3mJulu43QgcbArKmB85BMMeOIYnBSKC6myppHwNBtaKBKSsZmvUQ
M4eITNXbaLKOBVjVvlfAg0mueRbMN/xPcbCYFrE6paesYUwp+vRtewtOqoaAaMHeMwzBYhXi9xPY
kiAH0CSQWATKBiMLgjkcDqOk5zw8KzxCQxtPUcD2eYtDY3IWg4y2TjSmN5ExAO1aVMqzwkESg8BX
mDavoRCOZvvyHj+Jb0Ou5BPbM3YmgnFinf45TmQuKmMGYK4YzgKM7yRMmEdodlCoGwFpr0GgKAMw
HHuA2Ywj30OXAoOSQHpWzeBkgJdWJkVAdHw7XOSQ4Z70e5DIF8UhhG0CcK6krdNySxii3mprs723
qAQ5Ei+0CDB2YLitaGXwqDI4NNjJF4fhZgjjUMdZ9hiEgVo1BVeg4dyMArEie6qHBjd1NQTSgmjN
JIiQYmMhgRWRZgHIncKTpIiosbCApynEURdkyiBmSQNYr5lTcy2mUHCGyqSLlJ/AhUgCL1xO0g9B
YGOqCS9xOQk367bnAvSDnyRyQ4nC3SlnHuDmKEsQZbzeYpTmjfakMYbe4ITvsLAY+KRiHIXmgcGH
vFzpI1i68i67GKQmKJGSccYQTQHYOVvtSRmWCVEL1ZnibVsGE5qur5wr82vRnhLfTcBMysUBkMwU
QEBQGG1Ll3nVQgMcCamk/3eS70iKjSqhaDH8VND/68BwtqW5eSOUuyCNiKyZ5NYH4Bz5ICikjaYp
QRiUgJHje4n0sykEMgMgm60KhDDfzigOhF1qUC4t1EBEGfktCz7V6tdxIif+umJRZaYlbwpAgkj0
DgkUkcDqKgoCquXoKNRwZzTpGFWVGDqHWZ4BEGZHytuLkBeL6pIaCAYKMlaYuFa8kj1ugMeb2JI8
FS3LW/5o+aMQNMLBYoDf7JGkbF4sVC4aHn5ioBoBtMyG8GTntRCI5prdbVpFKiKSHZOgvGHeBt1o
feLuSKcKEhonp6Pg

Reply via email to