syscall: Fix handling of Unix domain @ addresses.
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 24 Nov 2012 20:46:59 +0000 (20:46 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 24 Nov 2012 20:46:59 +0000 (20:46 +0000)
From-SVN: r193783

libgo/go/syscall/socket.go
libgo/go/syscall/socket_linux.go

index 819e70a46d3eba5be0b7f72bd00dce5f1f41151b..3aa92012f08db0480571769b7ca88fa4b9321df5 100644 (file)
@@ -87,12 +87,16 @@ func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
        for i := 0; i < n; i++ {
                sa.raw.Path[i] = int8(name[i])
        }
+       // length is family (uint16), name, NUL.
+       sl := 2 + Socklen_t(n) + 1
        if sa.raw.Path[0] == '@' {
                sa.raw.Path[0] = 0
+               // Don't count trailing NUL for abstract address.
+               sl--
        }
 
        // length is family (uint16), name, NUL.
-       return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), 2 + Socklen_t(n) + 1, nil
+       return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), sl, nil
 }
 
 func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
index cd7d6eb98b9a5bf23b385ecc78af13c1c6a5f487..49a1625d08dc0ad37b84474acebd5060d1950d86 100644 (file)
@@ -103,7 +103,7 @@ func (sa *RawSockaddrUnix) getLen() (int, error) {
        // to be uninterpreted fixed-size binary blobs--but
        // everyone uses this convention.
        n := 0
-       for n < len(sa.Path)-3 && sa.Path[n] != 0 {
+       for n < len(sa.Path) && sa.Path[n] != 0 {
                n++
        }