bss_dgram.c: fix bugs [from HEAD].
PR: 2833
This commit is contained in:
parent
02a23fa309
commit
8d2f61ac70
@ -186,7 +186,7 @@ static void dgram_adjust_rcv_timeout(BIO *b)
|
|||||||
{
|
{
|
||||||
#if defined(SO_RCVTIMEO)
|
#if defined(SO_RCVTIMEO)
|
||||||
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
|
bio_dgram_data *data = (bio_dgram_data *)b->ptr;
|
||||||
int sz = sizeof(int);
|
union { size_t s; int i; } sz = {0};
|
||||||
|
|
||||||
/* Is a timer active? */
|
/* Is a timer active? */
|
||||||
if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
|
if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
|
||||||
@ -196,6 +196,8 @@ static void dgram_adjust_rcv_timeout(BIO *b)
|
|||||||
/* Read current socket timeout */
|
/* Read current socket timeout */
|
||||||
#ifdef OPENSSL_SYS_WINDOWS
|
#ifdef OPENSSL_SYS_WINDOWS
|
||||||
int timeout;
|
int timeout;
|
||||||
|
|
||||||
|
sz.i = sizeof(timeout);
|
||||||
if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
(void*)&timeout, &sz) < 0)
|
(void*)&timeout, &sz) < 0)
|
||||||
{ perror("getsockopt"); }
|
{ perror("getsockopt"); }
|
||||||
@ -205,9 +207,12 @@ static void dgram_adjust_rcv_timeout(BIO *b)
|
|||||||
data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
|
data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
sz.i = sizeof(data->socket_timeout);
|
||||||
if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
&(data->socket_timeout), (void *)&sz) < 0)
|
&(data->socket_timeout), (void *)&sz) < 0)
|
||||||
{ perror("getsockopt"); }
|
{ perror("getsockopt"); }
|
||||||
|
else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
|
||||||
|
OPENSSL_assert(sz.s<=sizeof(data->socket_timeout));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Get current time */
|
/* Get current time */
|
||||||
@ -376,11 +381,10 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
int *ip;
|
int *ip;
|
||||||
struct sockaddr *to = NULL;
|
struct sockaddr *to = NULL;
|
||||||
bio_dgram_data *data = NULL;
|
bio_dgram_data *data = NULL;
|
||||||
#if defined(IP_MTU_DISCOVER) || defined(IP_MTU)
|
int sockopt_val = 0;
|
||||||
long sockopt_val = 0;
|
#if defined(OPENSSL_SYS_LINUX) && (defined(IP_MTU_DISCOVER) || defined(IP_MTU))
|
||||||
unsigned int sockopt_len = 0;
|
socklen_t sockopt_len; /* assume that system supporting IP_MTU is
|
||||||
#endif
|
* modern enough to define socklen_t */
|
||||||
#ifdef OPENSSL_SYS_LINUX
|
|
||||||
socklen_t addr_len;
|
socklen_t addr_len;
|
||||||
union {
|
union {
|
||||||
struct sockaddr sa;
|
struct sockaddr sa;
|
||||||
@ -462,7 +466,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
break;
|
break;
|
||||||
/* (Linux)kernel sets DF bit on outgoing IP packets */
|
/* (Linux)kernel sets DF bit on outgoing IP packets */
|
||||||
case BIO_CTRL_DGRAM_MTU_DISCOVER:
|
case BIO_CTRL_DGRAM_MTU_DISCOVER:
|
||||||
#ifdef OPENSSL_SYS_LINUX
|
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
|
||||||
addr_len = (socklen_t)sizeof(addr);
|
addr_len = (socklen_t)sizeof(addr);
|
||||||
memset((void *)&addr, 0, sizeof(addr));
|
memset((void *)&addr, 0, sizeof(addr));
|
||||||
if (getsockname(b->num, &addr.sa, &addr_len) < 0)
|
if (getsockname(b->num, &addr.sa, &addr_len) < 0)
|
||||||
@ -470,7 +474,6 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sockopt_len = sizeof(sockopt_val);
|
|
||||||
switch (addr.sa.sa_family)
|
switch (addr.sa.sa_family)
|
||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
@ -479,7 +482,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
&sockopt_val, sizeof(sockopt_val))) < 0)
|
&sockopt_val, sizeof(sockopt_val))) < 0)
|
||||||
perror("setsockopt");
|
perror("setsockopt");
|
||||||
break;
|
break;
|
||||||
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER)
|
#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
sockopt_val = IPV6_PMTUDISC_DO;
|
sockopt_val = IPV6_PMTUDISC_DO;
|
||||||
if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
|
if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
|
||||||
@ -496,7 +499,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case BIO_CTRL_DGRAM_QUERY_MTU:
|
case BIO_CTRL_DGRAM_QUERY_MTU:
|
||||||
#ifdef OPENSSL_SYS_LINUX
|
#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
|
||||||
addr_len = (socklen_t)sizeof(addr);
|
addr_len = (socklen_t)sizeof(addr);
|
||||||
memset((void *)&addr, 0, sizeof(addr));
|
memset((void *)&addr, 0, sizeof(addr));
|
||||||
if (getsockname(b->num, &addr.sa, &addr_len) < 0)
|
if (getsockname(b->num, &addr.sa, &addr_len) < 0)
|
||||||
@ -658,10 +661,13 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
|
case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
|
||||||
#ifdef OPENSSL_SYS_WINDOWS
|
|
||||||
{
|
{
|
||||||
int timeout, sz = sizeof(timeout);
|
union { size_t s; int i; } sz = {0};
|
||||||
|
#ifdef OPENSSL_SYS_WINDOWS
|
||||||
|
int timeout;
|
||||||
struct timeval *tv = (struct timeval *)ptr;
|
struct timeval *tv = (struct timeval *)ptr;
|
||||||
|
|
||||||
|
sz.i = sizeof(timeout);
|
||||||
if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
(void*)&timeout, &sz) < 0)
|
(void*)&timeout, &sz) < 0)
|
||||||
{ perror("getsockopt"); ret = -1; }
|
{ perror("getsockopt"); ret = -1; }
|
||||||
@ -671,12 +677,20 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
tv->tv_usec = (timeout % 1000) * 1000;
|
tv->tv_usec = (timeout % 1000) * 1000;
|
||||||
ret = sizeof(*tv);
|
ret = sizeof(*tv);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
|
sz.i = sizeof(struct timeval);
|
||||||
if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
ptr, (void *)&ret) < 0)
|
ptr, (void *)&sz) < 0)
|
||||||
{ perror("getsockopt"); ret = -1; }
|
{ perror("getsockopt"); ret = -1; }
|
||||||
|
else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
|
||||||
|
{
|
||||||
|
OPENSSL_assert(sz.s<=sizeof(struct timeval));
|
||||||
|
ret = (int)sz.s;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = sz.i;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if defined(SO_SNDTIMEO)
|
#if defined(SO_SNDTIMEO)
|
||||||
@ -696,10 +710,13 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
|
case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
|
||||||
#ifdef OPENSSL_SYS_WINDOWS
|
|
||||||
{
|
{
|
||||||
int timeout, sz = sizeof(timeout);
|
union { size_t s; int i; } sz = {0};
|
||||||
|
#ifdef OPENSSL_SYS_WINDOWS
|
||||||
|
int timeout;
|
||||||
struct timeval *tv = (struct timeval *)ptr;
|
struct timeval *tv = (struct timeval *)ptr;
|
||||||
|
|
||||||
|
sz.i = sizeof(timeout);
|
||||||
if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
|
if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
|
||||||
(void*)&timeout, &sz) < 0)
|
(void*)&timeout, &sz) < 0)
|
||||||
{ perror("getsockopt"); ret = -1; }
|
{ perror("getsockopt"); ret = -1; }
|
||||||
@ -709,12 +726,20 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
tv->tv_usec = (timeout % 1000) * 1000;
|
tv->tv_usec = (timeout % 1000) * 1000;
|
||||||
ret = sizeof(*tv);
|
ret = sizeof(*tv);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
|
sz.i = sizeof(struct timeval);
|
||||||
if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
|
if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
|
||||||
ptr, (void *)&ret) < 0)
|
ptr, (void *)&sz) < 0)
|
||||||
{ perror("getsockopt"); ret = -1; }
|
{ perror("getsockopt"); ret = -1; }
|
||||||
|
else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
|
||||||
|
{
|
||||||
|
OPENSSL_assert(sz.s<=sizeof(struct timeval));
|
||||||
|
ret = (int)sz.s;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = sz.i;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
|
case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user