aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2015-11-06 17:29:27 +1100
committerAustin Clements <austin@google.com>2015-11-17 02:24:40 +0000
commitecb9ce6a781717364697c298e1d4c13e93e1c949 (patch)
tree76920099ed709e6fccb164e32aa322314fdb71df
parent5dda3bc2fd0616f8789cc7f2919d2af49fc64a66 (diff)
downloadgo-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.go2
-rw-r--r--src/net/net_windows_test.go53
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)
+ }
+}