aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-05-30 01:37:57 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-05-31 01:24:51 +0200
commite7bc944b4e4040994a349a22e66a784b2efd4c6b (patch)
tree145961d2cfee178cf956aeafef4af42525844cc5 /src
parentchacha20poly1305: combine stack variables into union (diff)
downloadwireguard-monolithic-historical-e7bc944b4e4040994a349a22e66a784b2efd4c6b.tar.xz
wireguard-monolithic-historical-e7bc944b4e4040994a349a22e66a784b2efd4c6b.zip
wg-quick: darwin: set DNS servers after delay on route change
This works around a race condition in macOS's network daemons, while also adding one in the form of possibly calling kill -ALRM on a stale PID; unfortunately bash can't wait from a trap.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/tools/wg-quick/darwin.bash8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/tools/wg-quick/darwin.bash b/src/tools/wg-quick/darwin.bash
index 81139e6..8bcc404 100755
--- a/src/tools/wg-quick/darwin.bash
+++ b/src/tools/wg-quick/darwin.bash
@@ -293,7 +293,8 @@ monitor_daemon() {
echo "[+] Backgrounding route monitor" >&2
(trap 'del_routes; del_dns; exit 0' INT TERM EXIT
exec >/dev/null 2>&1
- local event
+ local event pid=$BASHPID
+ [[ ${#DNS[@]} -gt 0 ]] && trap set_dns ALRM
# TODO: this should also check to see if the endpoint actually changes
# in response to incoming packets, and then call set_endpoint_direct_route
# then too. That function should be able to gracefully cleanup if the
@@ -303,7 +304,10 @@ monitor_daemon() {
ifconfig "$REAL_INTERFACE" >/dev/null 2>&1 || break
[[ $AUTO_ROUTE4 -eq 1 || $AUTO_ROUTE6 -eq 1 ]] && set_endpoint_direct_route
[[ -z $MTU ]] && set_mtu
- [[ ${#DNS[@]} -gt 0 ]] && set_dns
+ if [[ ${#DNS[@]} -gt 0 ]]; then
+ set_dns
+ sleep 2 && kill -ALRM $pid 2>/dev/null &
+ fi
done < <(route -n monitor)) & disown
}