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 <iant@golang.org>
diff --git a/src/net/file_unix.go b/src/net/file_unix.go
index 5b24c7d..9e581fc 100644
--- a/src/net/file_unix.go
+++ b/src/net/file_unix.go
@@ -91,7 +91,7 @@
 	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 351d9b3..fc44c1a 100644
--- a/src/net/unixsock_posix.go
+++ b/src/net/unixsock_posix.go
@@ -273,8 +273,9 @@
 // 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 @@
 	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 @@
 	// 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()