OSDN Git Service

syscall: Fix handling of Unix domain @ addresses.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Nov 2012 20:46:46 +0000 (20:46 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Nov 2012 20:46:46 +0000 (20:46 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@193782 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 9737590..d11d6cd 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 42ab218..224ca55 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++
        }