components/golang/patches/0041-release-branch.go1.5-net-fix-off-by-one-error-while-.patch
changeset 5331 9c955076ffe3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/golang/patches/0041-release-branch.go1.5-net-fix-off-by-one-error-while-.patch	Thu Jan 21 09:20:59 2016 -0800
@@ -0,0 +1,110 @@
+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
+