From: Alex Brainman Date: Fri, 6 Nov 2015 06:29:27 +0000 (+1100) Subject: net: fix off by one error while counting interfaces on windows X-Git-Tag: go1.6beta1~579 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c776cb999bf0dc650e233839ed5e99f9df231f24;p=gostls13.git net: fix off by one error while counting interfaces on windows Fixes #12301 Change-Id: I8d01ec9551c6cff7e6129e06a7deb36a3be9de41 Reviewed-on: https://go-review.googlesource.com/16751 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- diff --git a/src/net/interface_windows.go b/src/net/interface_windows.go index e25c1ed560..8cb9d76237 100644 --- a/src/net/interface_windows.go +++ b/src/net/interface_windows.go @@ -48,7 +48,7 @@ func getInterfaceInfos() ([]syscall.InterfaceInfo, error) { return nil, os.NewSyscallError("wsaioctl", err) } iilen := ret / uint32(unsafe.Sizeof(iia[0])) - return iia[:iilen-1], nil + return iia[:iilen], nil } func bytesEqualIP(a []byte, b []int8) bool { diff --git a/src/net/net_windows_test.go b/src/net/net_windows_test.go index da03e10b36..4f6bd45929 100644 --- a/src/net/net_windows_test.go +++ b/src/net/net_windows_test.go @@ -6,10 +6,13 @@ package net import ( "bufio" + "bytes" "fmt" "io" "os" "os/exec" + "sort" + "strings" "syscall" "testing" "time" @@ -163,3 +166,53 @@ func TestAcceptIgnoreSomeErrors(t *testing.T) { t.Fatalf(`"%s" received from recv, but "abc" expected`, s) } } + +func isWindowsXP(t *testing.T) bool { + v, err := syscall.GetVersion() + if err != nil { + t.Fatalf("GetVersion failed: %v", err) + } + major := byte(v) + return major < 6 +} + +func listInterfacesWithNetsh() ([]string, error) { + out, err := exec.Command("netsh", "interface", "ip", "show", "config").CombinedOutput() + if err != nil { + return nil, fmt.Errorf("netsh failed: %v: %q", err, string(out)) + } + lines := bytes.Split(out, []byte{'\r', '\n'}) + names := make([]string, 0) + for _, line := range lines { + f := bytes.Split(line, []byte{'"'}) + if len(f) == 3 { + names = append(names, string(f[1])) + } + } + return names, nil +} + +func TestInterfaceList(t *testing.T) { + if isWindowsXP(t) { + t.Skip("Windows XP netsh command does not provide required functionality") + } + ift, err := Interfaces() + if err != nil { + t.Fatal(err) + } + have := make([]string, 0) + for _, ifi := range ift { + have = append(have, ifi.Name) + } + sort.Strings(have) + + want, err := listInterfacesWithNetsh() + if err != nil { + t.Fatal(err) + } + sort.Strings(want) + + if strings.Join(want, "/") != strings.Join(have, "/") { + t.Fatalf("unexpected interface list %q, want %q", have, want) + } +}