]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: on linux use accept4 in Accept, fall back to accept
authorTobias Klauser <tklauser@distanz.ch>
Mon, 26 Apr 2021 22:11:00 +0000 (00:11 +0200)
committerTobias Klauser <tobias.klauser@gmail.com>
Mon, 26 Apr 2021 23:06:45 +0000 (23:06 +0000)
Android seems to block the accept syscall in newer versions. Use accept4
instead on kernel versions that support it (Linux 2.6.28 and newer) and
fall back to accept on ENOSYS.

Fixes #45767

Change-Id: If190ace0e0213207fdaf6eeb79a5543ef18456de
Reviewed-on: https://go-review.googlesource.com/c/go/+/313769
Trust: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>

src/syscall/syscall_linux.go

index 24e051dcbdb7a9c45008a25297293fc0c11d64b4..dfce3d0a4bac336618108e00b7ef0927afbb7029 100644 (file)
@@ -553,7 +553,11 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
        var rsa RawSockaddrAny
        var len _Socklen = SizeofSockaddrAny
-       nfd, err = accept(fd, &rsa, &len)
+       // Try accept4 first for Android, then try accept for kernel older than 2.6.28
+       nfd, err = accept4(fd, &rsa, &len, 0)
+       if err == ENOSYS {
+               nfd, err = accept(fd, &rsa, &len)
+       }
        if err != nil {
                return
        }