mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Check that two sockets with different types can't be connected to each other
PiperOrigin-RevId: 314450191
This commit is contained in:
@@ -252,7 +252,7 @@ func (e *connectionedEndpoint) Close() {
|
||||
// BidirectionalConnect implements BoundEndpoint.BidirectionalConnect.
|
||||
func (e *connectionedEndpoint) BidirectionalConnect(ctx context.Context, ce ConnectingEndpoint, returnConnect func(Receiver, ConnectedEndpoint)) *syserr.Error {
|
||||
if ce.Type() != e.stype {
|
||||
return syserr.ErrConnectionRefused
|
||||
return syserr.ErrWrongProtocolForSocket
|
||||
}
|
||||
|
||||
// Check if ce is e to avoid a deadlock.
|
||||
|
||||
@@ -417,7 +417,18 @@ func (s *socketOpsCommon) Connect(t *kernel.Task, sockaddr []byte, blocking bool
|
||||
defer ep.Release()
|
||||
|
||||
// Connect the server endpoint.
|
||||
return s.ep.Connect(t, ep)
|
||||
err = s.ep.Connect(t, ep)
|
||||
|
||||
if err == syserr.ErrWrongProtocolForSocket {
|
||||
// Linux for abstract sockets returns ErrConnectionRefused
|
||||
// instead of ErrWrongProtocolForSocket.
|
||||
path, _ := extractPath(sockaddr)
|
||||
if len(path) > 0 && path[0] == 0 {
|
||||
err = syserr.ErrConnectionRefused
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Write implements fs.FileOperations.Write.
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#include <algorithm>
|
||||
@@ -141,6 +142,47 @@ TEST_P(AllSocketPairTest, Connect) {
|
||||
SyscallSucceeds());
|
||||
}
|
||||
|
||||
TEST_P(AllSocketPairTest, ConnectWithWrongType) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
|
||||
int type;
|
||||
socklen_t typelen = sizeof(type);
|
||||
EXPECT_THAT(
|
||||
getsockopt(sockets->first_fd(), SOL_SOCKET, SO_TYPE, &type, &typelen),
|
||||
SyscallSucceeds());
|
||||
switch (type) {
|
||||
case SOCK_STREAM:
|
||||
type = SOCK_SEQPACKET;
|
||||
break;
|
||||
case SOCK_SEQPACKET:
|
||||
type = SOCK_STREAM;
|
||||
break;
|
||||
}
|
||||
|
||||
const FileDescriptor another_socket =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_UNIX, type, 0));
|
||||
|
||||
ASSERT_THAT(bind(sockets->first_fd(), sockets->first_addr(),
|
||||
sockets->first_addr_size()),
|
||||
SyscallSucceeds());
|
||||
|
||||
ASSERT_THAT(listen(sockets->first_fd(), 5), SyscallSucceeds());
|
||||
|
||||
if (sockets->first_addr()->sa_data[0] != 0) {
|
||||
ASSERT_THAT(connect(another_socket.get(), sockets->first_addr(),
|
||||
sockets->first_addr_size()),
|
||||
SyscallFailsWithErrno(EPROTOTYPE));
|
||||
} else {
|
||||
ASSERT_THAT(connect(another_socket.get(), sockets->first_addr(),
|
||||
sockets->first_addr_size()),
|
||||
SyscallFailsWithErrno(ECONNREFUSED));
|
||||
}
|
||||
|
||||
ASSERT_THAT(connect(sockets->second_fd(), sockets->first_addr(),
|
||||
sockets->first_addr_size()),
|
||||
SyscallSucceeds());
|
||||
}
|
||||
|
||||
TEST_P(AllSocketPairTest, ConnectNonListening) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user