]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix bug in net.Interfaces: handle elastic sdl_data size correctly
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 7 Jun 2011 20:06:36 +0000 (16:06 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 7 Jun 2011 20:06:36 +0000 (16:06 -0400)
Fixes #1921.

R=golang-dev, jeff
CC=golang-dev
https://golang.org/cl/4535120

src/pkg/net/interface_bsd.go

index 0c6ce767cd8362a347a9c2082f326ed2b2ae2a3b..141b95b381ef463f3bb5780eff4869928f600244 100644 (file)
@@ -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)