Skip to content

Commit bd09d9a

Browse files
mtth-bfftl0kod
authored andcommitted
selftests/landlock: Fix TCP bind(AF_UNSPEC) test case
The nominal error code for bind(AF_UNSPEC) on an IPv6 socket is -EAFNOSUPPORT, not -EINVAL. -EINVAL is only returned when the supplied address struct is too short, which happens to be the case in current selftests because they treat AF_UNSPEC like IPv4 sockets do: as an alias for AF_INET (which is a 16-byte struct instead of the 24 bytes required by IPv6 sockets). Make the union large enough for any address (by adding struct sockaddr_storage to the union), and make AF_UNSPEC addresses large enough for any family. Test for -EAFNOSUPPORT instead, and add a dedicated test case for truncated inputs with -EINVAL. Fixes: a549d05 ("selftests/landlock: Add network tests") Signed-off-by: Matthieu Buffet <matthieu@buffet.re> Link: https://lore.kernel.org/r/20251027190726.626244-2-matthieu@buffet.re Signed-off-by: Mickaël Salaün <mic@digikod.net>
1 parent e4d82cb commit bd09d9a

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

tools/testing/selftests/landlock/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ struct service_fixture {
237237
struct sockaddr_un unix_addr;
238238
socklen_t unix_addr_len;
239239
};
240+
struct sockaddr_storage _largest;
240241
};
241242
};
242243

tools/testing/selftests/landlock/net_test.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ static socklen_t get_addrlen(const struct service_fixture *const srv,
121121
{
122122
switch (srv->protocol.domain) {
123123
case AF_UNSPEC:
124+
if (minimal)
125+
return sizeof(sa_family_t);
126+
return sizeof(struct sockaddr_storage);
127+
124128
case AF_INET:
125129
return sizeof(srv->ipv4_addr);
126130

@@ -758,6 +762,11 @@ TEST_F(protocol, bind_unspec)
758762
bind_fd = socket_variant(&self->srv0);
759763
ASSERT_LE(0, bind_fd);
760764

765+
/* Tries to bind with too small addrlen. */
766+
EXPECT_EQ(-EINVAL, bind_variant_addrlen(
767+
bind_fd, &self->unspec_any0,
768+
get_addrlen(&self->unspec_any0, true) - 1));
769+
761770
/* Allowed bind on AF_UNSPEC/INADDR_ANY. */
762771
ret = bind_variant(bind_fd, &self->unspec_any0);
763772
if (variant->prot.domain == AF_INET) {
@@ -766,6 +775,8 @@ TEST_F(protocol, bind_unspec)
766775
TH_LOG("Failed to bind to unspec/any socket: %s",
767776
strerror(errno));
768777
}
778+
} else if (variant->prot.domain == AF_INET6) {
779+
EXPECT_EQ(-EAFNOSUPPORT, ret);
769780
} else {
770781
EXPECT_EQ(-EINVAL, ret);
771782
}
@@ -792,6 +803,8 @@ TEST_F(protocol, bind_unspec)
792803
} else {
793804
EXPECT_EQ(0, ret);
794805
}
806+
} else if (variant->prot.domain == AF_INET6) {
807+
EXPECT_EQ(-EAFNOSUPPORT, ret);
795808
} else {
796809
EXPECT_EQ(-EINVAL, ret);
797810
}
@@ -801,7 +814,8 @@ TEST_F(protocol, bind_unspec)
801814
bind_fd = socket_variant(&self->srv0);
802815
ASSERT_LE(0, bind_fd);
803816
ret = bind_variant(bind_fd, &self->unspec_srv0);
804-
if (variant->prot.domain == AF_INET) {
817+
if (variant->prot.domain == AF_INET ||
818+
variant->prot.domain == AF_INET6) {
805819
EXPECT_EQ(-EAFNOSUPPORT, ret);
806820
} else {
807821
EXPECT_EQ(-EINVAL, ret)

0 commit comments

Comments
 (0)