syscall: port fix for netbsd unix sockets from upstream

NetBSD does not include the null terminator when in its reported socket
length. Port the upstream bugfix for the issue (#6627).

This was likely missed during the usual upstream merge because the gc
and gccgo socket implementations have diverged quite a bit.

Change-Id: Id808bae481b5de494cfc641ca9d7f56fef6acd41
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261741
Trust: Than McIntosh <thanm@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/syscall/socket_bsd.go b/libgo/go/syscall/socket_bsd.go
index f62457f..40637bc 100644
--- a/libgo/go/syscall/socket_bsd.go
+++ b/libgo/go/syscall/socket_bsd.go
@@ -52,13 +52,19 @@
 }
 
 func (sa *RawSockaddrUnix) getLen() (int, error) {
-	if sa.Len < 3 || sa.Len > SizeofSockaddrUnix {
+	if sa.Len < 2 || sa.Len > SizeofSockaddrUnix {
 		return 0, EINVAL
 	}
-	n := int(sa.Len) - 3 // subtract leading Family, Len, terminating NUL.
+
+	// Some BSDs include the trailing NUL in the length, whereas
+	// others do not. Work around this by subtracting the leading
+	// family and len. The path is then scanned to see if a NUL
+	// terminator still exists within the length.
+	n := int(sa.Len) - 2 // subtract leading Family, Len
 	for i := 0; i < n; i++ {
 		if sa.Path[i] == 0 {
-			// found early NUL; assume Len is overestimating.
+			// found early NUL; assume Len included the NUL
+			// or was overestimating.
 			n = i
 			break
 		}