Skip to content
Snippets Groups Projects
Commit 1b36bcc3 authored by Joel Sing's avatar Joel Sing
Browse files

syscall: handle getsockname for unix sockets on openbsd 5.2

On OpenBSD 5.2, calling getsockname on an unbound Unix domain socket
results in a successful syscall, however the AF is unset and the length
is returned as zero. This has been changed to more portable behaviour,
which will be included in the OpenBSD 5.3 release.

For now, work around this by treating a successful getsockname() call
that returns a family of AF_UNSPEC and length of zero as a AF_UNIX
socket.

Makes TestPassFD work on OpenBSD 5.2.

Fixes #4956.

R=golang-dev, minux.ma, rsc, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/7449046
parent add33498
No related branches found
No related tags found
No related merge requests found
...@@ -13,7 +13,6 @@ import ( ...@@ -13,7 +13,6 @@ import (
"net" "net"
"os" "os"
"os/exec" "os/exec"
"runtime"
"syscall" "syscall"
"testing" "testing"
"time" "time"
...@@ -27,9 +26,6 @@ import ( ...@@ -27,9 +26,6 @@ import (
// "-test.run=^TestPassFD$" and an environment variable used to signal // "-test.run=^TestPassFD$" and an environment variable used to signal
// that the test should become the child process instead. // that the test should become the child process instead.
func TestPassFD(t *testing.T) { func TestPassFD(t *testing.T) {
if runtime.GOOS == "openbsd" {
t.Skip("issue 4956")
}
if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
passFDChild() passFDChild()
return return
......
...@@ -327,6 +327,11 @@ func Getsockname(fd int) (sa Sockaddr, err error) { ...@@ -327,6 +327,11 @@ func Getsockname(fd int) (sa Sockaddr, err error) {
if err = getsockname(fd, &rsa, &len); err != nil { if err = getsockname(fd, &rsa, &len); err != nil {
return return
} }
// TODO(jsing): Remove after OpenBSD 5.4 is released (see issue 3349).
if runtime.GOOS == "openbsd" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
rsa.Addr.Family = AF_UNIX
rsa.Addr.Len = SizeofSockaddrUnix
}
return anyToSockaddr(&rsa) return anyToSockaddr(&rsa)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment