On darwin the utun interface sometimes has no name.
Fixes #71064
Change-Id: Iec51641880515f8bd3f97bd892c26f68fd588fa3
Reviewed-on: https://go-review.googlesource.com/c/go/+/641855
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Commit-Queue: Ian Lance Taylor <iant@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
return nil, errInvalidMessage
}
attrs := uint(nativeEndian.Uint32(b[4:8]))
- if attrs&syscall.RTA_IFP == 0 {
- return nil, nil
- }
+
m := &InterfaceMessage{
Version: int(b[2]),
Type: int(b[3]),
extOff: w.extOff,
raw: b[:l],
}
- a, err := parseLinkAddr(b[w.bodyOff:])
- if err != nil {
- return nil, err
+
+ // We used to require that RTA_IFP always be set.
+ // It turns out that on darwin messages about the
+ // utun interface may not include a name. Issue #71064.
+ if attrs&syscall.RTA_IFP != 0 {
+ a, err := parseLinkAddr(b[w.bodyOff:])
+ if err != nil {
+ return nil, err
+ }
+ m.Addrs[syscall.RTAX_IFP] = a
+ m.Name = a.(*LinkAddr).Name
}
- m.Addrs[syscall.RTAX_IFP] = a
- m.Name = a.(*LinkAddr).Name
+
return m, nil
}
type Interface struct {
Index int // positive integer that starts at one, zero is never used
MTU int // maximum transmission unit
- Name string // e.g., "en0", "lo0", "eth0.100"
+ Name string // e.g., "en0", "lo0", "eth0.100"; may be the empty string
HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form
Flags Flags // e.g., FlagUp, FlagLoopback, FlagMulticast
}
zc.toIndex = make(map[string]int, len(ift))
zc.toName = make(map[int]string, len(ift))
for _, ifi := range ift {
- zc.toIndex[ifi.Name] = ifi.Index
- if _, ok := zc.toName[ifi.Index]; !ok {
- zc.toName[ifi.Index] = ifi.Name
+ if ifi.Name != "" {
+ zc.toIndex[ifi.Name] = ifi.Index
+ if _, ok := zc.toName[ifi.Index]; !ok {
+ zc.toName[ifi.Index] = ifi.Name
+ }
}
}
return true
t.Errorf("got %v; want %v", ifxi, ifi)
}
}
- ifxn, err := InterfaceByName(ifi.Name)
- if err != nil {
- t.Fatal(err)
- }
- if !reflect.DeepEqual(ifxn, &ifi) {
- t.Errorf("got %v; want %v", ifxn, ifi)
+ if ifi.Name != "" {
+ ifxn, err := InterfaceByName(ifi.Name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !reflect.DeepEqual(ifxn, &ifi) {
+ t.Errorf("got %v; want %v", ifxn, ifi)
+ }
}
t.Logf("%s: flags=%v index=%d mtu=%d hwaddr=%v", ifi.Name, ifi.Flags, ifi.Index, ifi.MTU, ifi.HardwareAddr)
}