From a4fd325c178ea29f554d69de4f2c3ffa09b53874 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 5 Dec 2015 01:15:26 -0500 Subject: [PATCH] net: do not unlink unix socket in UnixListener created from fd Fixes #11826. Change-Id: Id220dd558ca8d8d78c01975087122d27757deea0 Reviewed-on: https://go-review.googlesource.com/17458 Reviewed-by: Ian Lance Taylor --- src/net/file_unix.go | 2 +- src/net/unixsock_posix.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/net/file_unix.go b/src/net/file_unix.go index 5b24c7d09d1..9e581fcb419 100644 --- a/src/net/file_unix.go +++ b/src/net/file_unix.go @@ -91,7 +91,7 @@ func fileListener(f *os.File) (Listener, error) { case *TCPAddr: return &TCPListener{fd}, nil case *UnixAddr: - return &UnixListener{fd, laddr.Name}, nil + return &UnixListener{fd: fd, path: laddr.Name, unlink: false}, nil } fd.Close() return nil, syscall.EINVAL diff --git a/src/net/unixsock_posix.go b/src/net/unixsock_posix.go index 351d9b3a39a..fc44c1a458e 100644 --- a/src/net/unixsock_posix.go +++ b/src/net/unixsock_posix.go @@ -273,8 +273,9 @@ func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn // typically use variables of type Listener instead of assuming Unix // domain sockets. type UnixListener struct { - fd *netFD - path string + fd *netFD + path string + unlink bool } // ListenUnix announces on the Unix domain socket laddr and returns a @@ -292,7 +293,7 @@ func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) { if err != nil { return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err} } - return &UnixListener{fd: fd, path: fd.laddr.String()}, nil + return &UnixListener{fd: fd, path: fd.laddr.String(), unlink: true}, nil } // AcceptUnix accepts the next incoming call and returns the new @@ -335,7 +336,7 @@ func (l *UnixListener) Close() error { // is at least compatible with the auto-remove // sequence in ListenUnix. It's only non-Go // programs that can mess us up. - if l.path[0] != '@' { + if l.path[0] != '@' && l.unlink { syscall.Unlink(l.path) } err := l.fd.Close()