mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 17:45:07 -05:00
socket: handle negative sa_length
As the type of the sa_length parameter is signed, negative values should be handled as invalid.
This commit is contained in:
10
socket.c
10
socket.c
@@ -1479,7 +1479,7 @@ SCK_SockaddrToIPSockAddr(struct sockaddr *sa, int sa_length, IPSockAddr *ip_sa)
|
|||||||
|
|
||||||
switch (sa->sa_family) {
|
switch (sa->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
if (sa_length < sizeof (struct sockaddr_in))
|
if (sa_length < (int)sizeof (struct sockaddr_in))
|
||||||
return;
|
return;
|
||||||
ip_sa->ip_addr.family = IPADDR_INET4;
|
ip_sa->ip_addr.family = IPADDR_INET4;
|
||||||
ip_sa->ip_addr.addr.in4 = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
|
ip_sa->ip_addr.addr.in4 = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
|
||||||
@@ -1487,7 +1487,7 @@ SCK_SockaddrToIPSockAddr(struct sockaddr *sa, int sa_length, IPSockAddr *ip_sa)
|
|||||||
break;
|
break;
|
||||||
#ifdef FEAT_IPV6
|
#ifdef FEAT_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (sa_length < sizeof (struct sockaddr_in6))
|
if (sa_length < (int)sizeof (struct sockaddr_in6))
|
||||||
return;
|
return;
|
||||||
ip_sa->ip_addr.family = IPADDR_INET6;
|
ip_sa->ip_addr.family = IPADDR_INET6;
|
||||||
memcpy(&ip_sa->ip_addr.addr.in6, ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr,
|
memcpy(&ip_sa->ip_addr.addr.in6, ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr,
|
||||||
@@ -1507,7 +1507,7 @@ SCK_IPSockAddrToSockaddr(IPSockAddr *ip_sa, struct sockaddr *sa, int sa_length)
|
|||||||
{
|
{
|
||||||
switch (ip_sa->ip_addr.family) {
|
switch (ip_sa->ip_addr.family) {
|
||||||
case IPADDR_INET4:
|
case IPADDR_INET4:
|
||||||
if (sa_length < sizeof (struct sockaddr_in))
|
if (sa_length < (int)sizeof (struct sockaddr_in))
|
||||||
return 0;
|
return 0;
|
||||||
memset(sa, 0, sizeof (struct sockaddr_in));
|
memset(sa, 0, sizeof (struct sockaddr_in));
|
||||||
sa->sa_family = AF_INET;
|
sa->sa_family = AF_INET;
|
||||||
@@ -1519,7 +1519,7 @@ SCK_IPSockAddrToSockaddr(IPSockAddr *ip_sa, struct sockaddr *sa, int sa_length)
|
|||||||
return sizeof (struct sockaddr_in);
|
return sizeof (struct sockaddr_in);
|
||||||
#ifdef FEAT_IPV6
|
#ifdef FEAT_IPV6
|
||||||
case IPADDR_INET6:
|
case IPADDR_INET6:
|
||||||
if (sa_length < sizeof (struct sockaddr_in6))
|
if (sa_length < (int)sizeof (struct sockaddr_in6))
|
||||||
return 0;
|
return 0;
|
||||||
memset(sa, 0, sizeof (struct sockaddr_in6));
|
memset(sa, 0, sizeof (struct sockaddr_in6));
|
||||||
sa->sa_family = AF_INET6;
|
sa->sa_family = AF_INET6;
|
||||||
@@ -1532,7 +1532,7 @@ SCK_IPSockAddrToSockaddr(IPSockAddr *ip_sa, struct sockaddr *sa, int sa_length)
|
|||||||
return sizeof (struct sockaddr_in6);
|
return sizeof (struct sockaddr_in6);
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
if (sa_length < sizeof (struct sockaddr))
|
if (sa_length < (int)sizeof (struct sockaddr))
|
||||||
return 0;
|
return 0;
|
||||||
memset(sa, 0, sizeof (struct sockaddr));
|
memset(sa, 0, sizeof (struct sockaddr));
|
||||||
sa->sa_family = AF_UNSPEC;
|
sa->sa_family = AF_UNSPEC;
|
||||||
|
|||||||
Reference in New Issue
Block a user