summaryrefslogtreecommitdiff
path: root/libgo/go/syscall/route_bsd.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/syscall/route_bsd.go')
-rw-r--r--libgo/go/syscall/route_bsd.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/libgo/go/syscall/route_bsd.go b/libgo/go/syscall/route_bsd.go
index c62fdc3c81d..c635a1385e2 100644
--- a/libgo/go/syscall/route_bsd.go
+++ b/libgo/go/syscall/route_bsd.go
@@ -44,6 +44,9 @@ func rsaAlignOf(salen int) int {
// parseSockaddrLink parses b as a datalink socket address.
func parseSockaddrLink(b []byte) (*SockaddrDatalink, error) {
+ if len(b) < 8 {
+ return nil, EINVAL
+ }
sa, _, err := parseLinkLayerAddr(b[4:])
if err != nil {
return nil, err
@@ -77,16 +80,16 @@ func parseLinkLayerAddr(b []byte) (*SockaddrDatalink, int, error) {
Slen byte
}
lla := (*linkLayerAddr)(unsafe.Pointer(&b[0]))
- l := rsaAlignOf(int(4 + lla.Nlen + lla.Alen + lla.Slen))
+ l := 4 + int(lla.Nlen) + int(lla.Alen) + int(lla.Slen)
if len(b) < l {
return nil, 0, EINVAL
}
b = b[4:]
sa := &SockaddrDatalink{Type: lla.Type, Nlen: lla.Nlen, Alen: lla.Alen, Slen: lla.Slen}
- for i := 0; len(sa.Data) > i && i < int(lla.Nlen+lla.Alen+lla.Slen); i++ {
+ for i := 0; len(sa.Data) > i && i < l-4; i++ {
sa.Data[i] = int8(b[i])
}
- return sa, l, nil
+ return sa, rsaAlignOf(l), nil
}
// parseSockaddrInet parses b as an internet socket address.
@@ -336,7 +339,7 @@ func ParseRoutingMessage(b []byte) (msgs []RoutingMessage, err error) {
return msgs, nil
}
-// ParseRoutingMessage parses msg's payload as raw sockaddrs and
+// ParseRoutingSockaddr parses msg's payload as raw sockaddrs and
// returns the slice containing the Sockaddr interfaces.
func ParseRoutingSockaddr(msg RoutingMessage) ([]Sockaddr, error) {
sas, err := msg.sockaddr()