sendto is reportedly picky about destination socket address length.
authorAndy Polyakov <appro@openssl.org>
Thu, 7 Jan 2010 10:42:39 +0000 (10:42 +0000)
committerAndy Polyakov <appro@openssl.org>
Thu, 7 Jan 2010 10:42:39 +0000 (10:42 +0000)
PR: 2114
Submitted by: Robin Seggelmann

crypto/bio/bss_dgram.c

index ef739fcf5940be2fb71255a1ed80de9cf1eaa0c3..eb7e365467723ec83b2df2aa6197f87fbb831d44 100644 (file)
@@ -335,11 +335,21 @@ static int dgram_write(BIO *b, const char *in, int inl)
        if ( data->connected )
                ret=writesocket(b->num,in,inl);
        else
+               {
+               int peerlen = sizeof(data->peer);
+
+               if (data->peer.sa.sa_family == AF_INET)
+                       peerlen = sizeof(data->peer.sa_in);
+#if OPENSSL_USE_IVP6
+               else if (data->peer.sa.sa_family == AF_INET6)
+                       peerlen = sizeof(data->peer.sa_in6);
+#endif
 #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
-               ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, sizeof(data->peer));
+               ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, peerlen);
 #else
-               ret=sendto(b->num, in, inl, 0, &data->peer.sa, sizeof(data->peer));
+               ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
 #endif
+               }
 
        BIO_clear_retry_flags(b);
        if (ret <= 0)