]> Cypherpunks repositories - gostls13.git/commitdiff
net: permit Interface with no Name
authorIan Lance Taylor <iant@golang.org>
Thu, 9 Jan 2025 21:04:51 +0000 (13:04 -0800)
committerGopher Robot <gobot@golang.org>
Mon, 3 Feb 2025 20:11:12 +0000 (12:11 -0800)
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>
src/internal/routebsd/interface_classic.go
src/net/interface.go
src/net/interface_test.go

index 7b26c7eb2ad789ae0ca804a8364ae595b7dbbb59..af9531c0df7ee7ca38f18571b70980efe0a82122 100644 (file)
@@ -20,9 +20,7 @@ func (w *wireFormat) parseInterfaceMessage(b []byte) (Message, error) {
                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]),
@@ -32,12 +30,19 @@ func (w *wireFormat) parseInterfaceMessage(b []byte) (Message, error) {
                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
 }
 
index 74bb4f0e1c612246b076602ee71e9607dbc7094a..b6057780c4a98ff467f7f3bd275df7ad0a4997d6 100644 (file)
@@ -42,7 +42,7 @@ var (
 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
 }
@@ -221,9 +221,11 @@ func (zc *ipv6ZoneCache) update(ift []Interface, force bool) (updated bool) {
        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
index a97d675e7e0bd6802d3558936a8a1d868c6e4b0b..72befca0d89c9543c56c90d17d1cc307fcf1f243 100644 (file)
@@ -68,12 +68,14 @@ func TestInterfaces(t *testing.T) {
                                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)
        }