diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go index ba277f246..b59238110 100644 --- a/pkg/tcpip/transport/tcp/endpoint.go +++ b/pkg/tcpip/transport/tcp/endpoint.go @@ -1763,7 +1763,9 @@ func (e *endpoint) OnCorkOptionSet(v bool) { if !v { e.LockUser() defer e.UnlockUser() - e.snd.corkTimer.disable() + if e.snd != nil { + e.snd.corkTimer.disable() + } // Handle the corked data. if e.EndpointState().connected() { e.sendData(nil /* next */) diff --git a/test/syscalls/linux/tcp_socket.cc b/test/syscalls/linux/tcp_socket.cc index e0780eb24..8d6b7ff60 100644 --- a/test/syscalls/linux/tcp_socket.cc +++ b/test/syscalls/linux/tcp_socket.cc @@ -2696,6 +2696,15 @@ TEST_P(SimpleTcpSocketTest, EpollListeningSocket) { save_and_connect_thread.Join(); } +TEST_P(SimpleTcpSocketTest, SetTCPCorkOff) { + int fd; + ASSERT_THAT(fd = socket(GetParam(), SOCK_STREAM, IPPROTO_TCP), + SyscallSucceeds()); + + ASSERT_THAT( + setsockopt(fd, IPPROTO_TCP, TCP_CORK, &kSockOptOff, sizeof(kSockOptOff)), + SyscallSucceeds()); +} #endif // __linux__ INSTANTIATE_TEST_SUITE_P(AllInetTests, SimpleTcpSocketTest,