From a32f7fb8322bae7c1748a4bf6520c97aefaa197e Mon Sep 17 00:00:00 2001
From: Andy Polyakov <appro@openssl.org>
Date: Thu, 7 Jan 2010 10:44:21 +0000
Subject: [PATCH] sendto is reportedly picky about destination socket address
 length [from HEAD]. PR: 2114 Submitted by: Robin Seggelmann

---
 crypto/bio/bss_dgram.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/crypto/bio/bss_dgram.c b/crypto/bio/bss_dgram.c
index ef739fcf5..eb7e36546 100644
--- a/crypto/bio/bss_dgram.c
+++ b/crypto/bio/bss_dgram.c
@@ -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
-#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
-		ret=sendto(b->num, (char *)in, inl, 0, &data->peer.sa, sizeof(data->peer));
-#else
-		ret=sendto(b->num, in, inl, 0, &data->peer.sa, sizeof(data->peer));
+		{
+		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, peerlen);
+#else
+		ret=sendto(b->num, in, inl, 0, &data->peer.sa, peerlen);
+#endif
+		}
 
 	BIO_clear_retry_flags(b);
 	if (ret <= 0)