]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
IPAddress tests and corrections.
authorAmos Jeffries <amosjeffries@squid-cache.org>
Sat, 8 Nov 2008 13:39:39 +0000 (06:39 -0700)
committerAmos Jeffries <amosjeffries@squid-cache.org>
Sat, 8 Nov 2008 13:39:39 +0000 (06:39 -0700)
Fixes two cases where GetSockAddr did not set sin*_len properly

Fixes configure tests for sin*_len

TODO: still to find and fix where we are getting on FreeBSD:
 SYS SS_LEN=16
 SQD SS_LEN=0    (should be 16)

configure.in
lib/IPAddress.cc
lib/tests/testIPAddress.cc

index 16591d1d881502f8addcce66087f2fb58b6a7b53..877afaca9fd016a11da9bd65b5ee3d1e7f811cee 100755 (executable)
@@ -1992,6 +1992,7 @@ AC_CACHE_CHECK([for sin_len field in struct sockaddr_in],
         AC_TRY_COMPILE([
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
                 ],
                 [ struct sockaddr_in s; s.sin_len = 1; ],
                 [ ac_cv_have_sin_len_in_struct_sai="yes" ],
@@ -2010,6 +2011,7 @@ AC_CACHE_CHECK([for sin6_len field in struct sockaddr_in6],
         AC_TRY_COMPILE([
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
                 ],
                 [ struct sockaddr_in6 s; s.sin6_len = 1; ],
                 [ ac_cv_have_sin6_len_in_struct_sai="yes" ],
index b16d59d019f1014b62e2182fd6a2edaf0f6c3048..9797739abdf3490b504ec85ca82594819040ce45 100644 (file)
@@ -1107,7 +1107,7 @@ void IPAddress::GetSockAddr(struct sockaddr_storage &addr, const int family) con
         /* not all OS have this field, BUT when they do it can be a problem if set wrong */
         addr.ss_len = htons(sizeof(struct sockaddr_in6));
 #elif HAVE_SIN6_LEN_IN_SAI
-        sin->sin6_len = htons(sizeof(struct sockaddr_in6));
+        ((struct sockaddr_in6*)&addr)->sin6_len = htons(sizeof(struct sockaddr_in6));
 #endif
     } else if ( family == AF_INET || (family == AF_UNSPEC && IsIPv4()) ) {
         sin = (struct sockaddr_in*)&addr;
@@ -1162,6 +1162,12 @@ void IPAddress::GetSockAddr(struct sockaddr_in &buf) const {
     }
 
 #endif
+
+#if HAVE_SIN_LEN_IN_SAI
+    /* not all OS have this field, BUT when they do it can be a problem if set wrong */
+    buf.sin_len = htons(sizeof(struct sockaddr_in));
+#endif
+
 }
 
 #if USE_IPV6
@@ -1170,6 +1176,11 @@ void IPAddress::GetSockAddr(struct sockaddr_in6 &buf) const {
     memcpy(&buf, &m_SocketAddr, sizeof(struct sockaddr_in6));
     /* maintain address family. It may have changed inside us. */
     buf.sin6_family = AF_INET6;
+
+#if HAVE_SIN6_LEN_IN_SAI
+    /* not all OS have this field, BUT when they do it can be a problem if set wrong */
+    buf.sin6_len = htons(sizeof(struct sockaddr_in6));
+#endif
 }
 
 #endif
index 3151e32a9571d15f3d048afcf993d15c94f45d44..431f31907c86d0d7ab8e8155cc23a94a3824f417 100644 (file)
@@ -584,11 +584,11 @@ testIPAddress::testAddrInfo()
     /* display a byte-by-byte hex comparison of the addr cores */
     unsigned int *p;
     p = (unsigned int*)expect;
-    printf("\nSYS-ADDRINFO: %x %x %x %x %x %x ",
-           p[0],p[1],p[2],p[3],p[4],p[5] );
+    printf("\nSYS-ADDRINFO: %2x %2x %2x %2x %2x %2x",
+           p[0],p[1],p[2],p[3],p[4],p[5]);
 
     p = (unsigned int*)ipval;
-    printf("\nSQD-ADDRINFO: %x %x %x %x %x %x ",
+    printf("\nSQD-ADDRINFO: %2x %2x %2x %2x %2x %2x",
            p[0],p[1],p[2],p[3],p[4],p[5] );
     printf("\n");
 
@@ -598,6 +598,53 @@ testIPAddress::testAddrInfo()
     CPPUNIT_ASSERT_EQUAL( expect->ai_family, ipval->ai_family );
     // check the sockaddr it points to.
     CPPUNIT_ASSERT_EQUAL( expect->ai_addrlen, ipval->ai_addrlen );
+    p = (unsigned int*)(expect->ai_addr);
+    printf("\nSYS-ADDR: (%d)  %2x %2x %2x %2x %2x %2x %2x %2x",
+            expect->ai_addrlen,
+           p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7] );
+
+    p = (unsigned int*)(ipval->ai_addr);
+    printf("\nSQD-ADDR: (%d) %2x %2x %2x %2x %2x %2x %2x %2x",
+            ipval->ai_addrlen,
+           p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7] );
+    printf("\n");
+
+#if USE_IPV6
+#if HAVE_SS_LEN_IN_SS
+    printf("\nSYS SS_LEN=%d\nSQD SS_LEN=%d\n",((struct sockaddr_storage*)expect->ai_addr)->ss_len,
+           ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_storage*)expect->ai_addr)->ss_len,
+                          ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
+    CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_storage*)ipval->ai_addr)->ss_len, ipval->ai_addrlen );
+#endif
+#if HAVE_SIN6_LEN_IN_SAI
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_len,
+                          ((struct sockaddr_in6*)ipval->ai_addr)->sin6_len );
+    CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_in6*)ipval->ai_addr)->sin6_len, ipval->ai_addrlen );
+#endif
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_family,
+                          ((struct sockaddr_in6*)ipval->ai_addr)->sin6_family );
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_port,
+                          ((struct sockaddr_in6*)ipval->ai_addr)->sin6_port );
+#else
+#if HAVE_SS_LEN_IN_SS
+    printf("\nSYS SS_LEN=%d\nSQD SS_LEN=%d\n",((struct sockaddr_storage*)expect->ai_addr)->ss_len,
+           ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_storage*)expect->ai_addr)->ss_len,
+                          ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
+    CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_storage*)ipval->ai_addr)->ss_len, ipval->ai_addrlen );
+#endif
+#if HAVE_SIN_LEN_IN_SAI
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_len,
+                          ((struct sockaddr_in*)ipval->ai_addr)->sin_len );
+    CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_in*)ipval->ai_addr)->sin_len, ipval->ai_addrlen );
+#endif
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_family,
+                          ((struct sockaddr_in*)ipval->ai_addr)->sin_family );
+    CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_port,
+                          ((struct sockaddr_in*)ipval->ai_addr)->sin_port );
+#endif /* USE_IPV6 */
+
     CPPUNIT_ASSERT( memcmp( expect->ai_addr, ipval->ai_addr, expect->ai_addrlen ) == 0 );
 
     xfreeaddrinfo(expect);