diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2015-11-06 17:29:27 +1100 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2015-11-17 02:24:40 +0000 |
commit | ecb9ce6a781717364697c298e1d4c13e93e1c949 (patch) | |
tree | 76920099ed709e6fccb164e32aa322314fdb71df | |
parent | 5dda3bc2fd0616f8789cc7f2919d2af49fc64a66 (diff) | |
download | go-ecb9ce6a781717364697c298e1d4c13e93e1c949.tar.gz go-ecb9ce6a781717364697c298e1d4c13e93e1c949.zip |
[release-branch.go1.5] 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 <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/16984
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/net/interface_windows.go | 2 | ||||
-rw-r--r-- | src/net/net_windows_test.go | 53 |
2 files changed, 54 insertions, 1 deletions
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) + } +} |