diff options
author | Mikio Hara <mikioh.mikioh@gmail.com> | 2011-06-07 16:06:36 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-06-07 16:06:36 -0400 |
commit | a8fd3741874bb3c4a2bda6760d95239e63af8b94 (patch) | |
tree | 5c3f07e42515808b98e81164e9eec9f2731ddc97 | |
parent | be48115f48b4a8e827502771599ee274aaba3117 (diff) | |
download | go-a8fd3741874bb3c4a2bda6760d95239e63af8b94.tar.gz go-a8fd3741874bb3c4a2bda6760d95239e63af8b94.zip |
net: fix bug in net.Interfaces: handle elastic sdl_data size correctly
Fixes #1921.
R=golang-dev, jeff
CC=golang-dev
https://golang.org/cl/4535120
-rw-r--r-- | src/pkg/net/interface_bsd.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/pkg/net/interface_bsd.go b/src/pkg/net/interface_bsd.go index 0c6ce767cd..141b95b381 100644 --- a/src/pkg/net/interface_bsd.go +++ b/src/pkg/net/interface_bsd.go @@ -9,6 +9,7 @@ package net import ( "os" "syscall" + "unsafe" ) // IsUp returns true if ifi is up. @@ -102,16 +103,19 @@ func newLink(m *syscall.InterfaceMessage) ([]Interface, os.Error) { for _, s := range sas { switch v := s.(type) { case *syscall.SockaddrDatalink: + // NOTE: SockaddrDatalink.Data is minimum work area, + // can be larger. + m.Data = m.Data[unsafe.Offsetof(v.Data):] ifi := Interface{Index: int(m.Header.Index), rawFlags: int(m.Header.Flags)} var name [syscall.IFNAMSIZ]byte for i := 0; i < int(v.Nlen); i++ { - name[i] = byte(v.Data[i]) + name[i] = byte(m.Data[i]) } ifi.Name = string(name[:v.Nlen]) ifi.MTU = int(m.Header.Data.Mtu) addr := make([]byte, v.Alen) for i := 0; i < int(v.Alen); i++ { - addr[i] = byte(v.Data[int(v.Nlen)+i]) + addr[i] = byte(m.Data[int(v.Nlen)+i]) } ifi.HardwareAddr = addr[:v.Alen] ift = append(ift, ifi) |