android: Mitigate race condition on reauthentication
authorTobias Brunner <tobias@strongswan.org>
Fri, 1 Mar 2013 16:01:21 +0000 (17:01 +0100)
committerTobias Brunner <tobias@strongswan.org>
Fri, 1 Mar 2013 16:06:01 +0000 (17:06 +0100)
If the TUN device gets recreated while another thread in handle_plain()
has not yet called select(2) but already stored the file descriptor of the
old TUN device in its FD set, select() will fail with EBADF.

Fixes #301.

src/frontends/android/jni/libandroidbridge/backend/android_service.c

index 2f13be9..c83f0b4 100644 (file)
@@ -167,6 +167,10 @@ static job_requeue_t handle_plain(private_android_service_t *this)
 
        if (len < 0)
        {
+               if (errno == EBADF)
+               {       /* the TUN device got closed just before calling select(), retry */
+                       return JOB_REQUEUE_FAIR;
+               }
                DBG1(DBG_DMN, "select on TUN device failed: %s", strerror(errno));
                return JOB_REQUEUE_NONE;
        }