]> git.saurik.com Git - wxWidgets.git/commitdiff
initialize the local address before calling getsockname() on it (closes #10779)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 May 2009 13:07:21 +0000 (13:07 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 May 2009 13:07:21 +0000 (13:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60567 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/private/sckaddr.h
src/common/socket.cpp

index 19f9e0f674c5f73555fb799cc4aaa08e085a02b7..a4971fd4aab9fc956a43734f497d272bbea493c0 100644 (file)
@@ -166,6 +166,30 @@ public:
 #ifdef wxHAS_UNIX_DOMAIN_SOCKETS
     void CreateUnix();
 #endif // wxHAS_UNIX_DOMAIN_SOCKETS
 #ifdef wxHAS_UNIX_DOMAIN_SOCKETS
     void CreateUnix();
 #endif // wxHAS_UNIX_DOMAIN_SOCKETS
+    void Create(Family family)
+    {
+        switch ( family )
+        {
+            case FAMILY_INET:
+                CreateINET();
+                break;
+
+#if wxUSE_IPV6
+            case FAMILY_INET6:
+                CreateINET6();
+                break;
+#endif
+
+#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
+            case FAMILY_UNIX:
+#endif
+                CreateUnix();
+                break;
+
+            default:
+                wxFAIL_MSG( "unsupported socket address family" );
+        }
+    }
 
     // simple accessors
     Family GetFamily() const { return m_family; }
 
     // simple accessors
     Family GetFamily() const { return m_family; }
index 3c4f417e75596fb46ad83049a83e8ca97b95cd55..c7af4a26000869f338a46ee28e610d126c6dc429 100644 (file)
@@ -364,6 +364,14 @@ void wxSocketImpl::PostCreation()
 
 wxSocketError wxSocketImpl::UpdateLocalAddress()
 {
 
 wxSocketError wxSocketImpl::UpdateLocalAddress()
 {
+    if ( !m_local.IsOk() )
+    {
+        // ensure that we have a valid object using the correct family: correct
+        // being the same one as our peer uses as we have no other way to
+        // determine it
+        m_local.Create(m_peer.GetFamily());
+    }
+
     WX_SOCKLEN_T lenAddr = m_local.GetLen();
     if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 )
     {
     WX_SOCKLEN_T lenAddr = m_local.GetLen();
     if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 )
     {