]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
socket: handle negative sa_length
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 24 Jun 2020 10:07:55 +0000 (12:07 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 25 Jun 2020 10:43:25 +0000 (12:43 +0200)
As the type of the sa_length parameter is signed, negative values
should be handled as invalid.

socket.c

index f546a4b5c08224149a667a0bb500b2a18b06dfc5..325ef199f31f42f4dcfbb8b8339dd3c1d6ccebea 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -1479,7 +1479,7 @@ SCK_SockaddrToIPSockAddr(struct sockaddr *sa, int sa_length, IPSockAddr *ip_sa)
 
   switch (sa->sa_family) {
     case AF_INET:
-      if (sa_length < sizeof (struct sockaddr_in))
+      if (sa_length < (int)sizeof (struct sockaddr_in))
         return;
       ip_sa->ip_addr.family = IPADDR_INET4;
       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;
 #ifdef FEAT_IPV6
     case AF_INET6:
-      if (sa_length < sizeof (struct sockaddr_in6))
+      if (sa_length < (int)sizeof (struct sockaddr_in6))
         return;
       ip_sa->ip_addr.family = IPADDR_INET6;
       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) {
     case IPADDR_INET4:
-      if (sa_length < sizeof (struct sockaddr_in))
+      if (sa_length < (int)sizeof (struct sockaddr_in))
         return 0;
       memset(sa, 0, sizeof (struct sockaddr_in));
       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);
 #ifdef FEAT_IPV6
     case IPADDR_INET6:
-      if (sa_length < sizeof (struct sockaddr_in6))
+      if (sa_length < (int)sizeof (struct sockaddr_in6))
         return 0;
       memset(sa, 0, sizeof (struct sockaddr_in6));
       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);
 #endif
     default:
-      if (sa_length < sizeof (struct sockaddr))
+      if (sa_length < (int)sizeof (struct sockaddr))
         return 0;
       memset(sa, 0, sizeof (struct sockaddr));
       sa->sa_family = AF_UNSPEC;