mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
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: a549d055a2 ("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>
This commit is contained in:
parent
e4d82cbce2
commit
bd09d9a05c
|
|
@ -237,6 +237,7 @@ struct service_fixture {
|
|||
struct sockaddr_un unix_addr;
|
||||
socklen_t unix_addr_len;
|
||||
};
|
||||
struct sockaddr_storage _largest;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -121,6 +121,10 @@ static socklen_t get_addrlen(const struct service_fixture *const srv,
|
|||
{
|
||||
switch (srv->protocol.domain) {
|
||||
case AF_UNSPEC:
|
||||
if (minimal)
|
||||
return sizeof(sa_family_t);
|
||||
return sizeof(struct sockaddr_storage);
|
||||
|
||||
case AF_INET:
|
||||
return sizeof(srv->ipv4_addr);
|
||||
|
||||
|
|
@ -758,6 +762,11 @@ TEST_F(protocol, bind_unspec)
|
|||
bind_fd = socket_variant(&self->srv0);
|
||||
ASSERT_LE(0, bind_fd);
|
||||
|
||||
/* Tries to bind with too small addrlen. */
|
||||
EXPECT_EQ(-EINVAL, bind_variant_addrlen(
|
||||
bind_fd, &self->unspec_any0,
|
||||
get_addrlen(&self->unspec_any0, true) - 1));
|
||||
|
||||
/* Allowed bind on AF_UNSPEC/INADDR_ANY. */
|
||||
ret = bind_variant(bind_fd, &self->unspec_any0);
|
||||
if (variant->prot.domain == AF_INET) {
|
||||
|
|
@ -766,6 +775,8 @@ TEST_F(protocol, bind_unspec)
|
|||
TH_LOG("Failed to bind to unspec/any socket: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
} else if (variant->prot.domain == AF_INET6) {
|
||||
EXPECT_EQ(-EAFNOSUPPORT, ret);
|
||||
} else {
|
||||
EXPECT_EQ(-EINVAL, ret);
|
||||
}
|
||||
|
|
@ -792,6 +803,8 @@ TEST_F(protocol, bind_unspec)
|
|||
} else {
|
||||
EXPECT_EQ(0, ret);
|
||||
}
|
||||
} else if (variant->prot.domain == AF_INET6) {
|
||||
EXPECT_EQ(-EAFNOSUPPORT, ret);
|
||||
} else {
|
||||
EXPECT_EQ(-EINVAL, ret);
|
||||
}
|
||||
|
|
@ -801,7 +814,8 @@ TEST_F(protocol, bind_unspec)
|
|||
bind_fd = socket_variant(&self->srv0);
|
||||
ASSERT_LE(0, bind_fd);
|
||||
ret = bind_variant(bind_fd, &self->unspec_srv0);
|
||||
if (variant->prot.domain == AF_INET) {
|
||||
if (variant->prot.domain == AF_INET ||
|
||||
variant->prot.domain == AF_INET6) {
|
||||
EXPECT_EQ(-EAFNOSUPPORT, ret);
|
||||
} else {
|
||||
EXPECT_EQ(-EINVAL, ret)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user