Disallow setting a coordinator for a coordinator device.

The error code is based on the runc's behavior:

```shell
# ip link set dev br0 master br0
Error: Can not enslave a bridge to a bridge.
# echo $?
2
```

Reported-by: syzbot+9dcefbdcc9ecdeb4df96@syzkaller.appspotmail.com
PiperOrigin-RevId: 679761515
This commit is contained in:
Jing Chen
2024-09-27 16:13:45 -07:00
committed by gVisor bot
parent ffea874845
commit 5e8dd6482c
3 changed files with 27 additions and 3 deletions
+19 -2
View File
@@ -48,7 +48,7 @@ func TestWritePacketFromBridge(t *testing.T) {
bridgeEndpoint := stack.NewBridgeEndpoint(1500)
bridgeEndpoint.SetLinkAddress(bridgeLinkAddr)
if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil {
t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err)
t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err)
}
if err := s.SetNICCoordinator(nicID, bridgeID); err != nil {
t.Fatalf("s.SetNICCoordinator")
@@ -106,7 +106,7 @@ func TestWritePacketBetweenDevices(t *testing.T) {
bridgeEndpoint := stack.NewBridgeEndpoint(1500)
bridgeEndpoint.SetLinkAddress(bridgeLinkAddr)
if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil {
t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err)
t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err)
}
c := channel.New(1, header.EthernetMinimumSize, localLinkAddr)
@@ -150,6 +150,23 @@ func TestWritePacketBetweenDevices(t *testing.T) {
}
}
func TestSetCoordinator(t *testing.T) {
const (
bridgeLinkAddr = tcpip.LinkAddress("\x02\x02\x03\x04\x05\x08")
bridgeID = 6
)
s := stack.New(stack.Options{})
bridgeEndpoint := stack.NewBridgeEndpoint(1500)
bridgeEndpoint.SetLinkAddress(bridgeLinkAddr)
if err := s.CreateNIC(bridgeID, bridgeEndpoint); err != nil {
t.Fatalf("s.CreateNIC(%d, _): %s", bridgeID, err)
}
if err := s.SetNICCoordinator(bridgeID, bridgeID); err == nil {
t.Fatalf("s.SetNICCoordinator(%d, %d) = %s, want = %s", bridgeID, bridgeID, err, tcpip.ErrNoSuchFile{})
}
}
func TestMTU(t *testing.T) {
e := stack.NewBridgeEndpoint(1500)
mtus := []uint32{1000, 2000}
+4 -1
View File
@@ -1053,7 +1053,10 @@ func (s *Stack) SetNICCoordinator(id tcpip.NICID, mid tcpip.NICID) tcpip.Error {
if !ok {
return &tcpip.ErrUnknownNICID{}
}
// Setting a coordinator for a coordinator NIC is not allowed.
if _, ok := nic.NetworkLinkEndpoint.(CoordinatorNIC); ok {
return &tcpip.ErrNoSuchFile{}
}
m, ok := s.nics[mid]
if !ok {
return &tcpip.ErrUnknownNICID{}
+4
View File
@@ -31,6 +31,10 @@ ip link add hveth1 type veth peer name veth1 netns test1
ip link set up dev hveth0
ip link set up dev hveth1
if ip link set br0 master br0; then
exit 1
fi
ip link set hveth0 master br0
ip link set hveth1 master br0