]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
icmp6-util: make icmp6_receive() refuse packets without IPv6 sender address
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 22 Feb 2024 05:28:52 +0000 (14:28 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Sun, 25 Feb 2024 11:41:39 +0000 (11:41 +0000)
Previously, the function supports packets without IPv6 sender address
for unit tests. However, now unit tests use their own version of
icmp6_receive(). Hence, let's make the check more strict.

src/libsystemd-network/icmp6-util.c

index 72c20baadc8968061f5a43b03e9d7cc8b0ae0b5d..acfaa9838c43701ec2ba5a1c63b92ed197bbf345 100644 (file)
@@ -165,7 +165,6 @@ int icmp6_receive(
                 .msg_control = &control,
                 .msg_controllen = sizeof(control),
         };
-        struct in6_addr addr = {};
         ssize_t len;
 
         iov = IOVEC_MAKE(buffer, size);
@@ -177,17 +176,11 @@ int icmp6_receive(
         if ((size_t) len != size)
                 return -EINVAL;
 
-        if (msg.msg_namelen == sizeof(struct sockaddr_in6) &&
-            sa.in6.sin6_family == AF_INET6)  {
-
-                addr = sa.in6.sin6_addr;
-                if (!in6_addr_is_link_local(&addr) && !in6_addr_is_null(&addr))
-                        return -EADDRNOTAVAIL;
-
-        } else if (msg.msg_namelen > 0)
+        if (msg.msg_namelen != sizeof(struct sockaddr_in6) || sa.in6.sin6_family != AF_INET6)
                 return -EPFNOSUPPORT;
 
-        /* namelen == 0 only happens when running the test-suite over a socketpair */
+        if (!in6_addr_is_link_local(&sa.in6.sin6_addr) && !in6_addr_is_null(&sa.in6.sin6_addr))
+                return -EADDRNOTAVAIL;
 
         assert(!(msg.msg_flags & MSG_TRUNC));
 
@@ -198,6 +191,6 @@ int icmp6_receive(
         if (ret_timestamp)
                 triple_timestamp_from_cmsg(ret_timestamp, &msg);
         if (ret_sender)
-                *ret_sender = addr;
+                *ret_sender = sa.in6.sin6_addr;
         return 0;
 }