From e9b8e1b74ca3c8c1f5b32d37b0a33ac7bd5e048b Mon Sep 17 00:00:00 2001 From: Nicolas Lacasse Date: Fri, 21 Apr 2023 13:23:19 -0700 Subject: [PATCH] Automated rollback of changelist 525849045 PiperOrigin-RevId: 526120544 --- pkg/sentry/socket/hostinet/socket.go | 16 +++------------- pkg/waiter/waiter.go | 3 +-- test/syscalls/BUILD | 1 - test/syscalls/linux/socket_inet_loopback.cc | 16 +++------------- test/syscalls/linux/tcp_socket.cc | 14 ++++++++------ 5 files changed, 15 insertions(+), 35 deletions(-) diff --git a/pkg/sentry/socket/hostinet/socket.go b/pkg/sentry/socket/hostinet/socket.go index e2fb93f3f..c457cd427 100644 --- a/pkg/sentry/socket/hostinet/socket.go +++ b/pkg/sentry/socket/hostinet/socket.go @@ -384,7 +384,7 @@ func (s *Socket) Accept(t *kernel.Task, peerRequested bool, flags int, blocking } } else { var e waiter.Entry - e, ch = waiter.NewChannelEntry(waiter.ReadableEvents | waiter.EventHUp | waiter.EventErr) + e, ch = waiter.NewChannelEntry(waiter.ReadableEvents) s.EventRegister(&e) defer s.EventUnregister(&e) } @@ -540,21 +540,11 @@ func (s *Socket) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags int, have } } else { var e waiter.Entry - e, ch = waiter.NewChannelEntry(waiter.ReadableEvents | waiter.EventRdHUp | waiter.EventHUp | waiter.EventErr) + e, ch = waiter.NewChannelEntry(waiter.ReadableEvents) s.EventRegister(&e) defer s.EventUnregister(&e) } n, err = copyToDst() - - // If we got an RDHUP event, there's no use trying to - // read again since the socket has been shutdown. - if s.Readiness(waiter.EventRdHUp)&waiter.EventRdHUp > 0 { - // Don't return the EWOULDBLOCK. - if linuxerr.Equals(linuxerr.ErrWouldBlock, err) { - err = nil - } - break - } } } if err != nil { @@ -753,7 +743,7 @@ func (s *Socket) SendMsg(t *kernel.Task, src usermem.IOSequence, to []byte, flag } } else { var e waiter.Entry - e, ch = waiter.NewChannelEntry(waiter.WritableEvents | waiter.EventHUp | waiter.EventErr) + e, ch = waiter.NewChannelEntry(waiter.WritableEvents) s.EventRegister(&e) defer s.EventUnregister(&e) } diff --git a/pkg/waiter/waiter.go b/pkg/waiter/waiter.go index 89a332c1c..ff8495989 100644 --- a/pkg/waiter/waiter.go +++ b/pkg/waiter/waiter.go @@ -75,9 +75,8 @@ const ( EventRdNorm EventMask = 0x0040 // POLLRDNORM EventWrNorm EventMask = 0x0100 // POLLWRNORM EventInternal EventMask = 0x1000 - EventRdHUp EventMask = 0x2000 // POLLRDHUP - allEvents EventMask = 0x1f | EventRdNorm | EventWrNorm | EventRdHUp + allEvents EventMask = 0x1f | EventRdNorm | EventWrNorm ReadableEvents EventMask = EventIn | EventRdNorm WritableEvents EventMask = EventOut | EventWrNorm ) diff --git a/test/syscalls/BUILD b/test/syscalls/BUILD index cbd4fcf7f..2e048e04d 100644 --- a/test/syscalls/BUILD +++ b/test/syscalls/BUILD @@ -742,7 +742,6 @@ syscall_test( syscall_test( size = "large", - add_hostinet = True, shard_count = most_shards, test = "//test/syscalls/linux:socket_inet_loopback_test", ) diff --git a/test/syscalls/linux/socket_inet_loopback.cc b/test/syscalls/linux/socket_inet_loopback.cc index 68a16d84b..b81e8148a 100644 --- a/test/syscalls/linux/socket_inet_loopback.cc +++ b/test/syscalls/linux/socket_inet_loopback.cc @@ -498,8 +498,7 @@ TEST_P(SocketInetLoopbackTest, TCPInfoState) { int n = poll(&pfd, 1, kTimeout); ASSERT_GE(n, 0) << strerror(errno); ASSERT_EQ(n, 1); - if (IsRunningOnGvisor() && !IsRunningWithHostinet() && - GvisorPlatform() != Platform::kFuchsia) { + if (IsRunningOnGvisor() && GvisorPlatform() != Platform::kFuchsia) { // TODO(gvisor.dev/issue/6015): Notify POLLRDHUP on incoming FIN. ASSERT_EQ(pfd.revents, POLLIN); } else { @@ -650,17 +649,9 @@ void TestListenHangupConnectingRead(const SocketInetTestParam& param, hangup(listen_fd); - int connecting_client_error = ECONNREFUSED; - if (IsRunningWithHostinet()) { - // TODO(b/267210840): For some reason the connecting client gets - // ECONNRESET on hostinet. Maybe the intervening poll() implementation - // changes the socket state somehow? - connecting_client_error = ECONNRESET; - } - std::array, 2> sockets = { std::make_pair(established_client.get(), ECONNRESET), - std::make_pair(connecting_client.get(), connecting_client_error), + std::make_pair(connecting_client.get(), ECONNREFUSED), }; for (size_t i = 0; i < sockets.size(); i++) { SCOPED_TRACE(absl::StrCat("i=", i)); @@ -750,8 +741,7 @@ TEST_P(SocketInetLoopbackTest, TCPNonBlockingConnectClose) { ASSERT_GE(n, 0) << strerror(errno); ASSERT_EQ(n, 1); - if (IsRunningOnGvisor() && !IsRunningWithHostinet() && - GvisorPlatform() != Platform::kFuchsia) { + if (IsRunningOnGvisor() && GvisorPlatform() != Platform::kFuchsia) { // TODO(gvisor.dev/issue/6015): Notify POLLRDHUP on incoming FIN. ASSERT_EQ(pfd.revents, POLLIN); } else { diff --git a/test/syscalls/linux/tcp_socket.cc b/test/syscalls/linux/tcp_socket.cc index f35b2b73e..37b7add32 100644 --- a/test/syscalls/linux/tcp_socket.cc +++ b/test/syscalls/linux/tcp_socket.cc @@ -2488,16 +2488,18 @@ TEST_P(SimpleTcpSocketTest, SynRcvdOnListenerShutdown) { POLLOUT #else []() { - const int expected_revents = POLLIN | POLLOUT | POLLHUP | - POLLRDNORM | POLLWRNORM | - POLLRDHUP; + const int expected_revents = + POLLIN | POLLOUT | POLLHUP | POLLRDNORM | POLLWRNORM; // TODO(gvisor.dev/issue/6666): POLLERR is still present // after getsockopt(..., SO_ERROR, ...) call (unless // hostinet is used). - if (IsRunningWithHostinet()) { - return expected_revents; + if (IsRunningOnGvisor()) { + if (IsRunningWithHostinet()) { + return expected_revents; + } + return expected_revents | POLLPRI | POLLERR; } - return expected_revents | POLLPRI | POLLERR; + return expected_revents | POLLRDHUP; }() #endif );