Index: crypto/bio/bss_dgram.c
===================================================================
RCS file: /v/openssl/cvs/openssl/crypto/bio/bss_dgram.c,v
retrieving revision 1.7.2.20
diff -u -r1.7.2.20 bss_dgram.c
--- crypto/bio/bss_dgram.c	22 Nov 2009 12:24:43 -0000	1.7.2.20
+++ crypto/bio/bss_dgram.c	26 Nov 2009 10:20:24 -0000
@@ -566,18 +970,24 @@
 		break;
 	case BIO_CTRL_DGRAM_GET_PEER:
 		to = (struct sockaddr *) ptr;
-		switch (to->sa_family)
+		switch (data->peer.sa.sa_family)
 			{
 			case AF_INET:
-				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa_in)));
+				if (num == 0 || num > sizeof(data->peer.sa_in))
+					num = sizeof(data->peer.sa_in);
+				memcpy(to,&data->peer,(ret=num));
 				break;
 #if OPENSSL_USE_IPV6
 			case AF_INET6:
-				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa_in6)));
+				if (num == 0 || num > sizeof(data->peer.sa_in6))
+					num = sizeof(data->peer.sa_in6);
+				memcpy(to,&data->peer,(ret=num));
 				break;
 #endif
 			default:
-				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa)));
+				if (num == 0 || num > sizeof(data->peer.sa))
+					num = sizeof(data->peer.sa);
+				memcpy(to,&data->peer,(ret=num));
 				break;
 			}
 		break;
