From: Scott Cantor Date: Thu, 3 May 2012 21:36:17 +0000 (+0000) Subject: Fix BSD socket binds X-Git-Tag: 2.5.0~116 X-Git-Url: http://www.project-moonshot.org/gitweb/?a=commitdiff_plain;ds=sidebyside;h=6cf26b72c237696b92e9a9064002b86b5078c0c2;p=shibboleth%2Fcpp-sp.git Fix BSD socket binds --- diff --git a/configure.ac b/configure.ac index 04487cc..c6e3922 100644 --- a/configure.ac +++ b/configure.ac @@ -79,6 +79,8 @@ AC_CHECK_HEADERS([sys/utsname.h grp.h pwd.h]) AC_CHECK_HEADERS([sys/socket.h], [AC_DEFINE([SHIBSP_HAVE_SYS_SOCKET_H],[1],[Define to 1 if you have the header file.])], []) AC_CHECK_FUNCS([strchr strdup strstr timegm gmtime_r strtok_r strcasecmp getpwnam getgrnam]) AC_CHECK_TYPES([struct sockaddr_storage], [], [], [[#include ]]) +AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [[#include ]]) + # checks for pthreads ACX_PTHREAD([enable_threads="pthread"],[enable_threads="no"]) diff --git a/shibsp/remoting/impl/TCPListener.cpp b/shibsp/remoting/impl/TCPListener.cpp index 0cd15fd..c498163 100644 --- a/shibsp/remoting/impl/TCPListener.cpp +++ b/shibsp/remoting/impl/TCPListener.cpp @@ -206,7 +206,17 @@ bool TCPListener::bind(ShibSocket& s, bool force) const 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. +# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN +# ifdef HAVE_STRUCT_SOCKADDR_STORAGE + if (::bind(s, (const struct sockaddr*)&m_sockaddr, m_sockaddr.ss_len) < 0) { +# else + 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) { +# endif log_error("bind"); close(s); return false;