[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openssl-cvs
Subject:    [CVS] OpenSSL: OpenSSL_1_0_0-stable: openssl/crypto/bio/ b_sock.c bss_...
From:       "Andy Polyakov" <appro () openssl ! org>
Date:       2009-11-22 12:24:43
Message-ID: 20091122122444.20CC21EAE834 () master ! openssl ! org
[Download RAW message or body]

  OpenSSL CVS Repository
  http://cvs.openssl.org/
  ____________________________________________________________________________

  Server: cvs.openssl.org                  Name:   Andy Polyakov
  Root:   /v/openssl/cvs                   Email:  appro@openssl.org
  Module: openssl                          Date:   22-Nov-2009 13:24:43
  Branch: OpenSSL_1_0_0-stable             Handle: 2009112212244201

  Modified files:           (Branch: OpenSSL_1_0_0-stable)
    openssl/crypto/bio      b_sock.c bss_dgram.c

  Log:
    bio_sock.c and bss_dgram.c: update from HEAD.
    PR: 2069

  Summary:
    Revision    Changes     Path
    1.49.2.6    +2  -1      openssl/crypto/bio/b_sock.c
    1.7.2.20    +82 -57     openssl/crypto/bio/bss_dgram.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openssl/crypto/bio/b_sock.c
  ============================================================================
  $ cvs diff -u -r1.49.2.5 -r1.49.2.6 b_sock.c
  --- openssl/crypto/bio/b_sock.c	9 Nov 2009 14:09:53 -0000	1.49.2.5
  +++ openssl/crypto/bio/b_sock.c	22 Nov 2009 12:24:42 -0000	1.49.2.6
  @@ -822,7 +822,8 @@
   	if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
   		{
   		OPENSSL_assert(sa.len.s<=sizeof(sa.from));
  -		sa.len.i = (unsigned int)sa.len.s;
  +		sa.len.i = (int)sa.len.s;
  +		/* use sa.len.i from this point */
   		}
   	if (ret == INVALID_SOCKET)
   		{
  @@ .
  patch -p0 <<'@@ .'
  Index: openssl/crypto/bio/bss_dgram.c
  ============================================================================
  $ cvs diff -u -r1.7.2.19 -r1.7.2.20 bss_dgram.c
  --- openssl/crypto/bio/bss_dgram.c	15 Oct 2009 17:41:44 -0000	1.7.2.19
  +++ openssl/crypto/bio/bss_dgram.c	22 Nov 2009 12:24:43 -0000	1.7.2.20
  @@ -108,11 +108,13 @@
   
   typedef struct bio_dgram_data_st
   	{
  +	union {
  +		struct sockaddr sa;
  +		struct sockaddr_in sa_in;
   #if OPENSSL_USE_IPV6
  -	struct sockaddr_storage peer;
  -#else
  -	struct sockaddr_in peer;
  +		struct sockaddr_in6 sa_in6;
   #endif
  +	} peer;
   	unsigned int connected;
   	unsigned int _errno;
   	unsigned int mtu;
  @@ -278,28 +280,38 @@
   	int ret=0;
   	bio_dgram_data *data = (bio_dgram_data *)b->ptr;
   
  +	struct	{
  +	/*
  +	 * See commentary in b_sock.c. <appro>
  +	 */
  +	union	{ size_t s; int i; } len;
  +	union	{
  +		struct sockaddr sa;
  +		struct sockaddr_in sa_in;
   #if OPENSSL_USE_IPV6
  -	struct sockaddr_storage peer;
  -#else
  -	struct sockaddr_in peer;
  +		struct sockaddr_in6 sa_in6;
   #endif
  -	int peerlen = sizeof(peer);
  +		} peer;
  +	} sa;
  +
  +	sa.len.s=0;
  +	sa.len.i=sizeof(sa.peer);
   
   	if (out != NULL)
   		{
   		clear_socket_error();
  -		memset(&peer, 0x00, peerlen);
  -		/* Last arg in recvfrom is signed on some platforms and
  -		 * unsigned on others. It is of type socklen_t on some
  -		 * but this is not universal. Cast to (void *) to avoid
  -		 * compiler warnings.
  -		 */
  +		memset(&sa.peer, 0x00, sizeof(sa.peer));
   		dgram_adjust_rcv_timeout(b);
  -		ret=recvfrom(b->num,out,outl,0,(struct sockaddr *)&peer,(void *)&peerlen);
  +		ret=recvfrom(b->num,out,outl,0,&sa.peer.sa,(void *)&sa.len);
  +		if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
  +			{
  +			OPENSSL_assert(sa.len.s<=sizeof(sa.peer));
  +			sa.len.i = (int)sa.len.s;
  +			}
   		dgram_reset_rcv_timeout(b);
   
   		if ( ! data->connected  && ret >= 0)
  -			BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &peer);
  +			BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &sa.peer);
   
   		BIO_clear_retry_flags(b);
   		if (ret < 0)
  @@ -323,25 +335,10 @@
   	if ( data->connected )
   		ret=writesocket(b->num,in,inl);
   	else
  -#if OPENSSL_USE_IPV6
  -		if (data->peer.ss_family == AF_INET)
   #if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
  -			ret=sendto(b->num, (char *)in, inl, 0, (const struct sockaddr *)&data->peer, \
sizeof(struct sockaddr_in));  +		ret=sendto(b->num, (char *)in, inl, 0, \
&data->peer.sa, sizeof(data->peer));  #else
  -			ret=sendto(b->num, in, inl, 0, (const struct sockaddr *)&data->peer, \
                sizeof(struct sockaddr_in));
  -#endif
  -		else
  -#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
  -			ret=sendto(b->num, (char *)in, inl, 0, (const struct sockaddr *)&data->peer, \
                sizeof(struct sockaddr_in6));
  -#else
  -			ret=sendto(b->num, in, inl, 0, (const struct sockaddr *)&data->peer, \
                sizeof(struct sockaddr_in6));
  -#endif
  -#else
  -#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK)
  -		ret=sendto(b->num, (char *)in, inl, 0, (const struct sockaddr *)&data->peer, \
                sizeof(struct sockaddr_in));
  -#else
  -		ret=sendto(b->num, in, inl, 0, (const struct sockaddr *)&data->peer, \
                sizeof(struct sockaddr_in));
  -#endif
  +		ret=sendto(b->num, in, inl, 0, &data->peer.sa, sizeof(data->peer));
   #endif
   
   	BIO_clear_retry_flags(b);
  @@ -428,11 +425,20 @@
   		else
   			{
   #endif
  +			switch (to->sa_family)
  +				{
  +				case AF_INET:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa_in));
  +					break;
   #if OPENSSL_USE_IPV6
  -			memcpy(&(data->peer),to, sizeof(struct sockaddr_storage));
  -#else
  -			memcpy(&(data->peer),to, sizeof(struct sockaddr_in));
  -#endif
  +				case AF_INET6:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
  +					break;
  +#endif
  +				default:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa));
  +					break;
  +				}
   #if 0
   			}
   #endif
  @@ -537,41 +543,60 @@
   		if ( to != NULL)
   			{
   			data->connected = 1;
  +			switch (to->sa_family)
  +				{
  +				case AF_INET:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa_in));
  +					break;
   #if OPENSSL_USE_IPV6
  -			memcpy(&(data->peer),to, sizeof(struct sockaddr_storage));
  -#else
  -			memcpy(&(data->peer),to, sizeof(struct sockaddr_in));
  -#endif
  +				case AF_INET6:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
  +					break;
  +#endif
  +				default:
  +					memcpy(&data->peer,to,sizeof(data->peer.sa));
  +					break;
  +				}
   			}
   		else
   			{
   			data->connected = 0;
  -#if OPENSSL_USE_IPV6
  -			memset(&(data->peer), 0x00, sizeof(struct sockaddr_storage));
  -#else
  -			memset(&(data->peer), 0x00, sizeof(struct sockaddr_in));
  -#endif
  +			memset(&(data->peer), 0x00, sizeof(data->peer));
   			}
   		break;
   	case BIO_CTRL_DGRAM_GET_PEER:
   		to = (struct sockaddr *) ptr;
  -
  +		switch (to->sa_family)
  +			{
  +			case AF_INET:
  +				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa_in)));
  +				break;
   #if OPENSSL_USE_IPV6
  -		memcpy(to, &(data->peer), sizeof(struct sockaddr_storage));
  -		ret = sizeof(struct sockaddr_storage);
  -#else
  -		memcpy(to, &(data->peer), sizeof(struct sockaddr_in));
  -		ret = sizeof(struct sockaddr_in);
  -#endif
  +			case AF_INET6:
  +				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa_in6)));
  +				break;
  +#endif
  +			default:
  +				memcpy(to,&data->peer,(ret=sizeof(data->peer.sa)));
  +				break;
  +			}
   		break;
   	case BIO_CTRL_DGRAM_SET_PEER:
   		to = (struct sockaddr *) ptr;
  -
  +		switch (to->sa_family)
  +			{
  +			case AF_INET:
  +				memcpy(&data->peer,to,sizeof(data->peer.sa_in));
  +				break;
   #if OPENSSL_USE_IPV6
  -		memcpy(&(data->peer), to, sizeof(struct sockaddr_storage));
  -#else
  -		memcpy(&(data->peer), to, sizeof(struct sockaddr_in));
  -#endif
  +			case AF_INET6:
  +				memcpy(&data->peer,to,sizeof(data->peer.sa_in6));
  +				break;
  +#endif
  +			default:
  +				memcpy(&data->peer,to,sizeof(data->peer.sa));
  +				break;
  +			}
   		break;
   	case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
   		memcpy(&(data->next_timeout), ptr, sizeof(struct timeval));
  @@ .
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
CVS Repository Commit List                     openssl-cvs@openssl.org
Automated List Manager                           majordomo@openssl.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic