]> git.ipfire.org Git - thirdparty/wireguard-tools.git/commitdiff
wg-quick: kill route monitor when loop terminates
authorJason A. Donenfeld <Jason@zx2c4.com>
Wed, 21 Apr 2021 03:31:45 +0000 (21:31 -0600)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 21 Apr 2021 03:36:19 +0000 (21:36 -0600)
If the route monitor doesn't attempt to write more to stdout, then this
leaves a process hanging around. Kill it explicitly. We also switch to
using exec in the process substitution, to reduce a bash process.

Closes: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255286
Reported-by: Christos Chatzaras <chris@cretaforce.gr>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
src/wg-quick/darwin.bash
src/wg-quick/freebsd.bash
src/wg-quick/openbsd.bash

index cde1b541ece8343f422eced57ab4a9def83829d1..c77441fa3812f7da67ba066e0344230562556874 100755 (executable)
@@ -324,22 +324,24 @@ monitor_daemon() {
        echo "[+] Backgrounding route monitor" >&2
        (trap 'del_routes; del_dns; exit 0' INT TERM EXIT
        exec >/dev/null 2>&1
-       local event pid=$BASHPID
+       exec 19< <(exec route -n monitor)
+       local event bpid=$BASHPID mpid=$!
        [[ ${#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
        # endpoints change.
-       while read -r event; do
+       while read -u 19 -r event; do
                [[ $event == RTM_* ]] || continue
                ifconfig "$REAL_INTERFACE" >/dev/null 2>&1 || break
                [[ $AUTO_ROUTE4 -eq 1 || $AUTO_ROUTE6 -eq 1 ]] && set_endpoint_direct_route
                [[ -z $MTU ]] && set_mtu
                if [[ ${#DNS[@]} -gt 0 ]]; then
                        set_dns
-                       sleep 2 && kill -ALRM $pid 2>/dev/null &
+                       sleep 2 && kill -ALRM $bpid 2>/dev/null &
                fi
-       done < <(route -n monitor)) &
+       done
+       kill $mpid) &
        [[ -n $LAUNCHED_BY_LAUNCHD ]] || disown
 }
 
index e731384248d29a2529bacb68181ebe059e36d859..b529ab2a508861d5569feeb3f350cb8ff6f22ea1 100755 (executable)
@@ -284,17 +284,19 @@ monitor_daemon() {
        (make_temp
        trap 'del_routes; clean_temp; exit 0' INT TERM EXIT
        exec >/dev/null 2>&1
-       local event
+       exec 19< <(exec route -n monitor)
+       local event pid=$!
        # 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
        # endpoints change.
-       while read -r event; do
+       while read -u 19 -r event; do
                [[ $event == RTM_* ]] || continue
                ifconfig "$INTERFACE" >/dev/null 2>&1 || break
                [[ $AUTO_ROUTE4 -eq 1 || $AUTO_ROUTE6 -eq 1 ]] && set_endpoint_direct_route
                # TODO: set the mtu as well, but only if up
-       done < <(route -n monitor)) & disown
+       done
+       kill $pid) & disown
 }
 
 HAVE_SET_DNS=0
index 15550c8058f406fbe1bf719e9fbb108422e27ba4..9826aa3c2996256d27f583933ce45616f2bc9665 100755 (executable)
@@ -266,17 +266,19 @@ monitor_daemon() {
        echo "[+] Backgrounding route monitor" >&2
        (trap 'del_routes; exit 0' INT TERM EXIT
        exec >/dev/null 2>&1
-       local event
+       exec 19< <(exec route -n monitor)
+       local event pid=$!
        # 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
        # endpoints change.
-       while read -r event; do
+       while read -u 19 -r event; do
                [[ $event == RTM_* ]] || continue
                ifconfig "$REAL_INTERFACE" >/dev/null 2>&1 || break
                [[ $AUTO_ROUTE4 -eq 1 || $AUTO_ROUTE6 -eq 1 ]] && set_endpoint_direct_route
                # TODO: set the mtu as well, but only if up
-       done < <(route -n monitor)) & disown
+       done
+       kill $pid) & disown
 }
 
 set_dns() {