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)