components/golang/patches/0041-release-branch.go1.5-net-fix-off-by-one-error-while-.patch
author Neng Xue <neng.xue@oracle.com>
Thu, 05 May 2016 17:00:57 -0700
changeset 5932 707ac80a571d
parent 5331 9c955076ffe3
permissions -rw-r--r--
23094068 uland krb Makefile missing pkg depend on network/dns/bind

From ecb9ce6a781717364697c298e1d4c13e93e1c949 Mon Sep 17 00:00:00 2001
From: Alex Brainman <[email protected]>
Date: Fri, 6 Nov 2015 17:29:27 +1100
Subject: [PATCH 41/63] [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 <[email protected]>
Run-TryBot: Ian Lance Taylor <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-on: https://go-review.googlesource.com/16984
Run-TryBot: Austin Clements <[email protected]>
Reviewed-by: Alex Brainman <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
---
 src/net/interface_windows.go |  2 +-
 src/net/net_windows_test.go  | 53 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/src/net/interface_windows.go b/src/net/interface_windows.go
index e25c1ed..8cb9d76 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 da03e10..4f6bd45 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)
+	}
+}
-- 
2.6.1