diff --git a/app/src/main/jni/netguard/netguard.h b/app/src/main/jni/netguard/netguard.h index 96302b10..9442cc27 100644 --- a/app/src/main/jni/netguard/netguard.h +++ b/app/src/main/jni/netguard/netguard.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -498,3 +499,5 @@ int compare_u32(uint32_t seq1, uint32_t seq2); const char *strstate(const int state); char *hex(const u_int8_t *data, const size_t len); + +int is_readable(int fd); diff --git a/app/src/main/jni/netguard/session.c b/app/src/main/jni/netguard/session.c index 21136e70..f2492f10 100644 --- a/app/src/main/jni/netguard/session.c +++ b/app/src/main/jni/netguard/session.c @@ -233,8 +233,9 @@ void *handle_events(void *a) { (ev[i].events & EPOLLHUP) != 0); // Check upstream - if (check_tun(args, &ev[i], epoll_fd, sessions, maxsessions) < 0) - error = 1; + while (!error && is_readable(args->tun)) + if (check_tun(args, &ev[i], epoll_fd, sessions, maxsessions) < 0) + error = 1; } else { log_android(ANDROID_LOG_DEBUG, diff --git a/app/src/main/jni/netguard/util.c b/app/src/main/jni/netguard/util.c index 5ce74120..486692c7 100644 --- a/app/src/main/jni/netguard/util.c +++ b/app/src/main/jni/netguard/util.c @@ -152,3 +152,18 @@ int32_t get_local_port(const int sock) { return ntohs(sin.sin_port); } +int is_readable(int fd) { + struct pollfd p; + p.fd = fd; + p.events = POLLIN; + p.revents = 0; + int r = poll(&p, 1, 0); + if (r < 0) { + log_android(ANDROID_LOG_ERROR, "poll readable error %d: %s", errno, strerror(errno)); + return 0; + } + else if (r == 0) + return 0; + else + return (p.revents & POLLIN); +}