aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikio Hara <mikioh.mikioh@gmail.com>2011-06-07 16:06:36 -0400
committerRuss Cox <rsc@golang.org>2011-06-07 16:06:36 -0400
commita8fd3741874bb3c4a2bda6760d95239e63af8b94 (patch)
tree5c3f07e42515808b98e81164e9eec9f2731ddc97
parentbe48115f48b4a8e827502771599ee274aaba3117 (diff)
downloadgo-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.go8
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)