Check that two sockets with different types can't be connected to each other

PiperOrigin-RevId: 314450191
This commit is contained in:
Andrei Vagin
2020-06-02 19:19:15 -07:00
committed by gVisor bot
parent c615faaee4
commit e6334e81ca
3 changed files with 55 additions and 2 deletions
@@ -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.
+12 -1
View File
@@ -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.
+42
View File
@@ -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());