diff options
author | Ghanan Gowripalan <ghanan@google.com> | 2021-09-17 15:29:25 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-09-17 15:32:04 -0700 |
commit | 4076153be6840c50ade746087b221a12d7bd2b3b (patch) | |
tree | 06e73dd457e462f193a5c3c6678cac59a3f7fd18 /test/syscalls/linux/packet_socket.cc | |
parent | b28bd31bb6d920c23b5036d94bc7123143369e24 (diff) |
Fix lock ordering violation
This fixes a lock ordering violations introduced in
https://github.com/google/gvisor/commit/ae3bd32011889fe59bb89946532dd7ee14973696
and https://github.com/google/gvisor/commit/477d7e5e10378e2f80f21ac9f536d12c4b94d7ce
when connecting/binding sockets races with handling of packets/errors as
the connect/bind path takes the transport/internal/network.Endpoint.mu
lock before taking stack.endpointsByNIC.mu but the locks are taken in the
reverse order when handling packets/errors.
The fix is to revert the change to use a lock instead of atomics in
https://github.com/google/gvisor/commit/477d7e5e10378e2f80f21ac9f536d12c4b94d7ce
and introduce a new lock protecting only the endpoint info in
transport/internal/network.Endpoint.
```
goroutine 60 [semacquire]:
sync.runtime_Semacquire(0x62c957)
go/gc/src/runtime/sema.go:56 +0x25
gvisor/pkg/sync/sync.(*CrossGoroutineRWMutex).RLock(0xc0006c4870)
gvisor/pkg/sync/rwmutex_unsafe.go:76 +0x57
gvisor/pkg/sync/sync.(*RWMutex).RLock(...)
gvisor/pkg/sync/rwmutex_unsafe.go:254
gvisor/pkg/tcpip/transport/internal/network/network.(*Endpoint).State(0xc0006c4858)
gvisor/pkg/tcpip/transport/internal/network/endpoint.go:123 +0x3c
gvisor/pkg/tcpip/transport/udp/udp.(*endpoint).HandleError(0xc0006c4840, {0x1c3a418, 0x2847498}, 0xc0006bdeea)
gvisor/pkg/tcpip/transport/udp/endpoint.go:983 +0x5c
gvisor/pkg/tcpip/stack/stack.(*endpointsByNIC).handleError(0xc00003dd70, 0xc0000f08c0, {0x75e1, {0xc0005da110, 0x10}, 0xdeea, {0xc0005da120, 0x10}}, {0x1c3a418, 0x2847498}, ...)
gvisor/pkg/tcpip/stack/transport_demuxer.go:203 +0x254
gvisor/pkg/tcpip/stack/stack.(*transportDemuxer).deliverError(0xc00047c588, 0xc000688ca8, 0x86dd, 0x11, {0x1c3a418, 0x2847498}, 0xdf2345, {0x75e1, {0xc0005da110, 0x10}, ...})
gvisor/pkg/tcpip/stack/transport_demuxer.go:631 +0x205
gvisor/pkg/tcpip/stack/stack.(*nic).DeliverTransportError(0xc0000f08c0, {0xc0005da110, 0x10}, {0xc0005da120, 0x10}, 0x62c985, 0x0, {0x1c3a418, 0x2847498}, 0xc000299000)
gvisor/pkg/tcpip/stack/nic.go:922 +0x253
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).handleControl(0xc00045d000, {0x1c3a418, 0x2847498}, 0xc000299000)
gvisor/pkg/tcpip/network/ipv6/icmp.go:209 +0x3ac
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).handleICMP(0xc00045d000, 0xc000299000, 0x0, 0x10)
gvisor/pkg/tcpip/network/ipv6/icmp.go:353 +0x96c
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).processExtensionHeaders(0xc00045d000, {0xc0005b7f0e, 0x28, 0x30}, 0xc000299000, 0x0)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1554 +0x849
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).handleValidatedPacket(0xc00045d000, {0xc0005b7f0e, 0x28, 0x2b206370203a3033}, 0xc000299000, {0x18baf5d, 0x2})
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1191 +0x396
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).HandlePacket(0xc00045d000, 0xc000031310)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1107 +0x538
gvisor/pkg/tcpip/stack/stack.(*nic).DeliverNetworkPacket(0xc0000f08c0, {0x0, 0xc000688c38}, {0xc0005da09a, 0x6}, 0x86dd, 0xc000299000)
gvisor/pkg/tcpip/stack/nic.go:779 +0x3fd
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).DeliverNetworkPacket(0xc0003d1f10, {0xc0005da08a, 0x6}, {0xc0005da09a, 0x6}, 0x62c985, 0x962610)
gvisor/pkg/tcpip/link/nested/nested.go:59 +0xd1
gvisor/pkg/tcpip/link/sniffer/sniffer.(*endpoint).DeliverNetworkPacket(0xc0003d1f10, {0xc0005da08a, 0x6}, {0xc0005da09a, 0x6}, 0x610f56, 0x6)
gvisor/pkg/tcpip/link/sniffer/sniffer.go:140 +0x87
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).DeliverNetworkPacket(0xc0005200f0, {0xc0005da08a, 0x6}, {0xc0005da09a, 0x6}, 0x397800, 0x200)
gvisor/pkg/tcpip/link/nested/nested.go:59 +0xd1
gvisor/pkg/tcpip/link/ethernet/ethernet.(*Endpoint).DeliverNetworkPacket(0xc0005200f0, {0xc0005032c0, 0x4}, {0x4, 0x26e}, 0x60d600, 0x6)
gvisor/pkg/tcpip/link/ethernet/ethernet.go:63 +0x1ad
gvisor/pkg/tcpip/link/loopback/loopback.(*endpoint).WriteRawPacket(0xc00019a540, 0xc000298f00)
gvisor/pkg/tcpip/link/loopback/loopback.go:107 +0x191
gvisor/pkg/tcpip/link/loopback/loopback.(*endpoint).WritePacket(0x62c985, {{{0xc0005da060, 0x10}, {0xc0005da070, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/loopback/loopback.go:80 +0x37
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).WritePacket(...)
gvisor/pkg/tcpip/link/nested/nested.go:107
gvisor/pkg/tcpip/link/ethernet/ethernet.(*Endpoint).WritePacket(0xc0005200f0, {{{0xc0005da060, 0x10}, {0xc0005da070, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/ethernet/ethernet.go:78 +0x142
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).WritePacket(...)
gvisor/pkg/tcpip/link/nested/nested.go:107
gvisor/pkg/tcpip/link/sniffer/sniffer.(*endpoint).WritePacket(0xc0003d1f10, {{{0xc0005da060, 0x10}, {0xc0005da070, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/sniffer/sniffer.go:169 +0x108
gvisor/pkg/tcpip/stack/stack.(*nic).writePacket(0xc0000f08c0, {{{0xc0005da060, 0x10}, {0xc0005da070, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/stack/nic.go:380 +0x264
gvisor/pkg/tcpip/stack/stack.(*nic).writePacketBuffer(0xc0006c3540, {{{0xc0005da060, 0x10}, {0xc0005da070, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/stack/nic.go:324 +0xec
gvisor/pkg/tcpip/stack/stack.(*nic).enqueuePacketBuffer(0xc0000f08c0, 0x62c985, 0xfc2c55, {0x1bfdac0, 0xc000298f00})
gvisor/pkg/tcpip/stack/nic.go:339 +0x234
gvisor/pkg/tcpip/stack/stack.(*nic).WritePacket(0xc000298f00, 0xffd8, 0x41a000, 0x4)
gvisor/pkg/tcpip/stack/nic.go:317 +0x50
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).writePacket(0xc00045d000, 0xc0006c3540, 0xc000298f00, 0x3, 0x0)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:823 +0x427
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).WritePacket(0xc00045d000, 0xc0006c3540, {0x86dd, 0x0, 0x0}, 0xc000298f00)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:774 +0x2db
gvisor/pkg/tcpip/stack/stack.(*Route).WritePacket(0xc0006c3540, {0x37a9f0, 0xc0, 0x0}, 0x86dd)
gvisor/pkg/tcpip/stack/route.go:462 +0xe4
gvisor/pkg/tcpip/network/ipv6/ipv6.(*protocol).returnError(0xc000298400, {0x1c253e8, 0x2847498}, 0xc000298e00)
gvisor/pkg/tcpip/network/ipv6/icmp.go:1277 +0x15f8
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).processExtensionHeaders(0xc00045d000, {0xc0005b7ece, 0x28, 0x30}, 0xc000298e00, 0x0)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1565 +0x12e5
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).handleValidatedPacket(0xc00045d000, {0xc0005b7ece, 0x28, 0x0}, 0xc000298e00, {0x18baf5d, 0x2})
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1191 +0x396
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).HandlePacket(0xc00045d000, 0xc0003df610)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:1107 +0x538
gvisor/pkg/tcpip/stack/stack.(*nic).DeliverNetworkPacket(0xc0000f08c0, {0x0, 0xc000688838}, {0xc000663fea, 0x6}, 0x86dd, 0xc000298e00)
gvisor/pkg/tcpip/stack/nic.go:779 +0x3fd
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).DeliverNetworkPacket(0xc0003d1f10, {0xc000663fda, 0x6}, {0xc000663fea, 0x6}, 0x62c985, 0x962610)
gvisor/pkg/tcpip/link/nested/nested.go:59 +0xd1
gvisor/pkg/tcpip/link/sniffer/sniffer.(*endpoint).DeliverNetworkPacket(0xc0003d1f10, {0xc000663fda, 0x6}, {0xc000663fea, 0x6}, 0x610f56, 0x6)
gvisor/pkg/tcpip/link/sniffer/sniffer.go:140 +0x87
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).DeliverNetworkPacket(0xc0005200f0, {0xc000663fda, 0x6}, {0xc000663fea, 0x6}, 0x397800, 0x200)
gvisor/pkg/tcpip/link/nested/nested.go:59 +0xd1
gvisor/pkg/tcpip/link/ethernet/ethernet.(*Endpoint).DeliverNetworkPacket(0xc0005200f0, {0xc00003dec0, 0x2}, {0x2, 0x23e}, 0x60d600, 0x6)
gvisor/pkg/tcpip/link/ethernet/ethernet.go:63 +0x1ad
gvisor/pkg/tcpip/link/loopback/loopback.(*endpoint).WriteRawPacket(0xc00019a540, 0xc000298d00)
gvisor/pkg/tcpip/link/loopback/loopback.go:107 +0x191
gvisor/pkg/tcpip/link/loopback/loopback.(*endpoint).WritePacket(0x62c985, {{{0xc000663fa0, 0x10}, {0xc000378f40, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/loopback/loopback.go:80 +0x37
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).WritePacket(...)
gvisor/pkg/tcpip/link/nested/nested.go:107
gvisor/pkg/tcpip/link/ethernet/ethernet.(*Endpoint).WritePacket(0xc0005200f0, {{{0xc000663fa0, 0x10}, {0xc000378f40, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/ethernet/ethernet.go:78 +0x142
gvisor/pkg/tcpip/link/nested/nested.(*Endpoint).WritePacket(...)
gvisor/pkg/tcpip/link/nested/nested.go:107
gvisor/pkg/tcpip/link/sniffer/sniffer.(*endpoint).WritePacket(0xc0003d1f10, {{{0xc000663fa0, 0x10}, {0xc000378f40, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/link/sniffer/sniffer.go:169 +0x108
gvisor/pkg/tcpip/stack/stack.(*nic).writePacket(0xc0000f08c0, {{{0xc000663fa0, 0x10}, {0xc000378f40, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/stack/nic.go:380 +0x264
gvisor/pkg/tcpip/stack/stack.(*nic).writePacketBuffer(0xc0006c2fa0, {{{0xc000663fa0, 0x10}, {0xc000378f40, 0x10}, {0x1bf6590, 0x6}, {0x0, 0x0}, 0x86dd, ...}, ...}, ...)
gvisor/pkg/tcpip/stack/nic.go:324 +0xec
gvisor/pkg/tcpip/stack/stack.(*nic).enqueuePacketBuffer(0xc0000f08c0, 0x62c985, 0xfc2c55, {0x1bfdac0, 0xc000298d00})
gvisor/pkg/tcpip/stack/nic.go:339 +0x234
gvisor/pkg/tcpip/stack/stack.(*nic).WritePacket(0xc000298d00, 0xffd8, 0x41a000, 0x4)
gvisor/pkg/tcpip/stack/nic.go:317 +0x50
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).writePacket(0xc00045d000, 0xc0006c2fa0, 0xc000298d00, 0x3, 0x0)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:823 +0x427
gvisor/pkg/tcpip/network/ipv6/ipv6.(*endpoint).WritePacket(0xc00045d000, 0xc0006c2fa0, {0x86dd, 0x0, 0x0}, 0xc000298d00)
gvisor/pkg/tcpip/network/ipv6/ipv6.go:774 +0x2db
gvisor/pkg/tcpip/stack/stack.(*Route).WritePacket(0xc0006c2fa0, {0x2080000, 0xea, 0xde}, 0x6)
gvisor/pkg/tcpip/stack/route.go:462 +0xe4
gvisor/pkg/tcpip/transport/internal/network/network.(*WriteContext).WritePacket(0xc0003e05e0, 0xc000298d00, 0x0)
gvisor/pkg/tcpip/transport/internal/network/endpoint.go:212 +0x154
gvisor/pkg/tcpip/transport/udp/udp.(*endpoint).write(0xc0006c4840, {0x1c23ad0, 0xc0006cfd60}, {0xc0002ecf00, 0xf0, 0xdb, 0x3})
gvisor/pkg/tcpip/transport/udp/endpoint.go:457 +0x74c
gvisor/pkg/tcpip/transport/udp/udp.(*endpoint).Write(0xc0006c4840, {0x1c23ad0, 0xc0006cfd60}, {0xc0002ecf00, 0x85, 0xc9, 0x62})
gvisor/pkg/tcpip/transport/udp/endpoint.go:323 +0x74
goroutine 133 [semacquire]:
sync.runtime_Semacquire(0xc00003dd70)
go/gc/src/runtime/sema.go:56 +0x25
gvisor/pkg/sync/sync.(*CrossGoroutineRWMutex).Lock(0xc00003dd70)
gvisor/pkg/sync/rwmutex_unsafe.go:151 +0x79
gvisor/pkg/sync/sync.(*RWMutex).Lock(...)
gvisor/pkg/sync/rwmutex_unsafe.go:286
gvisor/pkg/tcpip/stack/stack.(*endpointsByNIC).unregisterEndpoint(0xc00003dd70, 0x37a300, {0x1c3a558, 0xc0006c4840}, {0x0, 0x0, 0x0})
gvisor/pkg/tcpip/stack/transport_demuxer.go:246 +0x72
gvisor/pkg/tcpip/stack/stack.(*transportEndpoints).unregisterEndpoint(0xc0004b3f40, {0x75e1, {0x0, 0x0}, 0x0, {0x0, 0x0}}, {0x1c3a558, 0xc0006c4840}, {0x0, ...}, ...)
gvisor/pkg/tcpip/stack/transport_demuxer.go:52 +0x193
gvisor/pkg/tcpip/stack/stack.(*transportDemuxer).unregisterEndpoint(0xc00047c588, {0xc000663fc8, 0x2, 0x0}, 0x11, {0x75e1, {0x0, 0x0}, 0x0, {0x0, ...}}, ...)
gvisor/pkg/tcpip/stack/transport_demuxer.go:527 +0x1d4
gvisor/pkg/tcpip/stack/stack.(*Stack).UnregisterTransportEndpoint(...)
gvisor/pkg/tcpip/stack/stack.go:1417
gvisor/pkg/tcpip/transport/udp/udp.(*endpoint).Connect.func1(0x86dd, {0x75e1, {0x0, 0x0}, 0x0, {0x0, 0x0}}, {0x75e1, {0x0, 0x0}, ...})
gvisor/pkg/tcpip/transport/udp/endpoint.go:619 +0x433
gvisor/pkg/tcpip/transport/internal/network/network.(*Endpoint).ConnectAndThen(0xc0006c4858, {0x0, {0xc000144270, 0xa0000eade88c0}, 0xabc5}, 0xc000353518)
gvisor/pkg/tcpip/transport/internal/network/endpoint.go:408 +0x3cc
gvisor/pkg/tcpip/transport/udp/udp.(*endpoint).Connect(0xc0006c4840, {0x37b9e0, {0xc000144270, 0xc000328a80}, 0xc1a0})
gvisor/pkg/tcpip/transport/udp/endpoint.go:593 +0x149
```
PiperOrigin-RevId: 397412256
Diffstat (limited to 'test/syscalls/linux/packet_socket.cc')
0 files changed, 0 insertions, 0 deletions