mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
unix: allow to bind unix sockets only to AF_UNIX addresses
Reported-by: syzbot+2c0bcfd87fb4e8b7b009@syzkaller.appspotmail.com PiperOrigin-RevId: 285228312
This commit is contained in:
@@ -326,7 +326,7 @@ func AddressAndFamily(sfamily int, addr []byte, strict bool) (tcpip.FullAddress,
|
||||
}
|
||||
|
||||
family := usermem.ByteOrder.Uint16(addr)
|
||||
if family != uint16(sfamily) && (!strict && family != linux.AF_UNSPEC) {
|
||||
if family != uint16(sfamily) && (strict || family != linux.AF_UNSPEC) {
|
||||
return tcpip.FullAddress{}, family, syserr.ErrAddressFamilyNotSupported
|
||||
}
|
||||
|
||||
|
||||
@@ -118,6 +118,9 @@ func (s *SocketOperations) Endpoint() transport.Endpoint {
|
||||
func extractPath(sockaddr []byte) (string, *syserr.Error) {
|
||||
addr, _, err := netstack.AddressAndFamily(linux.AF_UNIX, sockaddr, true /* strict */)
|
||||
if err != nil {
|
||||
if err == syserr.ErrAddressFamilyNotSupported {
|
||||
err = syserr.ErrInvalidArgument
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,21 @@ TEST_P(UnixSocketPairTest, BindToBadName) {
|
||||
SyscallFailsWithErrno(ENOENT));
|
||||
}
|
||||
|
||||
TEST_P(UnixSocketPairTest, BindToBadFamily) {
|
||||
auto pair =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(UnixDomainSocketPair(SOCK_SEQPACKET).Create());
|
||||
|
||||
constexpr char kBadName[] = "/some/path/that/does/not/exist";
|
||||
sockaddr_un sockaddr;
|
||||
sockaddr.sun_family = AF_INET;
|
||||
memcpy(sockaddr.sun_path, kBadName, sizeof(kBadName));
|
||||
|
||||
EXPECT_THAT(
|
||||
bind(pair->first_fd(), reinterpret_cast<struct sockaddr*>(&sockaddr),
|
||||
sizeof(sockaddr)),
|
||||
SyscallFailsWithErrno(EINVAL));
|
||||
}
|
||||
|
||||
TEST_P(UnixSocketPairTest, RecvmmsgTimeoutAfterRecv) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
char sent_data[10];
|
||||
|
||||
Reference in New Issue
Block a user