diff options
Diffstat (limited to 'libgo/go/syscall/route_bsd.go')
-rw-r--r-- | libgo/go/syscall/route_bsd.go | 11 |
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() |