]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
rwcancel: handle EINTR and EAGAIN in unixSelect()
authorAvery Pennarun <apenwarr@gmail.com>
Sat, 12 Oct 2019 07:46:13 +0000 (00:46 -0700)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 17 Oct 2019 13:19:17 +0000 (15:19 +0200)
On my Chromebook (Linux 4.19.44 in a VM) and on an AWS EC2
machine, select() was sometimes returning EINTR. This is
harmless and just means you should try again. So let's try
again.

This eliminates a problem where the tunnel fails to come up
correctly and the program needs to be restarted.

Signed-off-by: Avery Pennarun <apenwarr@gmail.com>
rwcancel/rwcancel.go

index 62397c29aaf56ddd700c5155d619b110ef85b4db..808e6918361055382f84f135f1f9eccd2548b8f2 100644 (file)
@@ -60,7 +60,13 @@ func (rw *RWCancel) ReadyRead() bool {
        fdset := fdSet{}
        fdset.set(rw.fd)
        fdset.set(closeFd)
-       err := unixSelect(max(rw.fd, closeFd)+1, &fdset.FdSet, nil, nil, nil)
+       var err error
+       for {
+               err = unixSelect(max(rw.fd, closeFd)+1, &fdset.FdSet, nil, nil, nil)
+               if err == nil || !RetryAfterError(err) {
+                       break
+               }
+       }
        if err != nil {
                return false
        }
@@ -75,7 +81,13 @@ func (rw *RWCancel) ReadyWrite() bool {
        fdset := fdSet{}
        fdset.set(rw.fd)
        fdset.set(closeFd)
-       err := unixSelect(max(rw.fd, closeFd)+1, nil, &fdset.FdSet, nil, nil)
+       var err error
+       for {
+               err = unixSelect(max(rw.fd, closeFd)+1, nil, &fdset.FdSet, nil, nil)
+               if err == nil || !RetryAfterError(err) {
+                       break
+               }
+       }
        if err != nil {
                return false
        }