[cpp-sp COMMIT] /branches/REL_2/shibsp/remoting/impl/TCPListener.cpp

noreply at shibboleth.net noreply at shibboleth.net
Sun May 5 23:20:34 EDT 2013


Author: scantor
Date: Sun May  5 23:20:34 2013
New Revision: 3845

URL: http://svn.shibboleth.net/view/cpp-sp?rev=3845&view=rev
Log:
https://issues.shibboleth.net/jira/browse/SSPCPP-552

Modified:
    branches/REL_2/shibsp/remoting/impl/TCPListener.cpp

Modified: branches/REL_2/shibsp/remoting/impl/TCPListener.cpp
URL: http://svn.shibboleth.net/view/cpp-sp/branches/REL_2/shibsp/remoting/impl/TCPListener.cpp?rev=3845&r1=3844&r2=3845&view=diff
==============================================================================
--- branches/REL_2/shibsp/remoting/impl/TCPListener.cpp (original)
+++ branches/REL_2/shibsp/remoting/impl/TCPListener.cpp Sun May  5 23:20:34 2013
@@ -88,6 +88,7 @@
         string m_address;
         unsigned short m_port;
         vector<IPRange> m_acl;
+        size_t m_sockaddrlen;
 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE
         struct sockaddr_storage m_sockaddr;
 #else
@@ -157,15 +158,16 @@
         return false;
     }
 
+    m_sockaddrlen = ret->ai_addrlen;
     if (ret->ai_family == AF_INET) {
-        memcpy(&m_sockaddr, ret->ai_addr, ret->ai_addrlen);
+        memcpy(&m_sockaddr, ret->ai_addr, m_sockaddrlen);
         freeaddrinfo(ret);
         ((struct sockaddr_in*)&m_sockaddr)->sin_port=htons(m_port);
         return true;
     }
 #if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_STORAGE)
     else if (ret->ai_family == AF_INET6) {
-        memcpy(&m_sockaddr, ret->ai_addr, ret->ai_addrlen);
+        memcpy(&m_sockaddr, ret->ai_addr, m_sockaddrlen);
         freeaddrinfo(ret);
         ((struct sockaddr_in6*)&m_sockaddr)->sin6_port=htons(m_port);
         return true;
@@ -200,14 +202,14 @@
     ::setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));
 
 #ifdef WIN32
-    if (SOCKET_ERROR==::bind(s, (const struct sockaddr*)&m_sockaddr, sizeof(m_sockaddr)) || SOCKET_ERROR==::listen(s, 3)) {
+    if (SOCKET_ERROR==::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddrlen) || SOCKET_ERROR==::listen(s, 3)) {
         log_error("bind");
         close(s);
         return false;
     }
 #else
-    // Newer BSDs require the struct length be passed based on the socket address.
-    // Others have no field for that and take the whole struct size like Windows does.
+    // Newer BSDs, and Solaris, require the struct length be passed based on the socket address.
+    // All but Solaris seem to have an ss_len field in the sockaddr_storage struct.
 # ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
 #  ifdef HAVE_STRUCT_SOCKADDR_STORAGE
     if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.ss_len) < 0) {
@@ -215,7 +217,7 @@
     if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.sin_len) < 0) {
 #  endif
 # else
-    if (::bind(s, (const struct sockaddr*)&m_sockaddr, sizeof(m_sockaddr)) < 0) {
+    if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddrlen) < 0) {
 # endif
         log_error("bind");
         close(s);
@@ -229,7 +231,7 @@
 bool TCPListener::connect(ShibSocket& s) const
 {
 #ifdef WIN32
-    if(SOCKET_ERROR==::connect(s, (const struct sockaddr*)&m_sockaddr, sizeof(m_sockaddr)))
+    if(SOCKET_ERROR==::connect(s, (const struct sockaddr*)&m_sockaddr, m_sockaddrlen))
         return log_error("connect");
 #else
     // Newer BSDs require the struct length be passed based on the socket address.
@@ -241,7 +243,7 @@
     if (::connect(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.sin_len) < 0)
 #  endif
 # else
-    if (::connect(s, (const struct sockaddr*)&m_sockaddr, sizeof(m_sockaddr)) < 0)
+    if (::connect(s, (const struct sockaddr*)&m_sockaddr, m_sockaddrlen) < 0)
 # endif
         return log_error("connect");
 #endif



More information about the commits mailing list