svn commit: r499755 - in head/net/wireguard: . files
Bernhard Froehlich
decke at FreeBSD.org
Tue Apr 23 12:36:31 UTC 2019
Author: decke
Date: Tue Apr 23 12:36:30 2019
New Revision: 499755
URL: https://svnweb.freebsd.org/changeset/ports/499755
Log:
net/wireguard: workaround SIOCGIFSTATUS race in FreeBSD kernel
PR: 233955
Added:
head/net/wireguard/files/patch-b3e1a1b07d3631bd816f9bfc27452a89dc29fa28 (contents, props changed)
Modified:
head/net/wireguard/Makefile
Modified: head/net/wireguard/Makefile
==============================================================================
--- head/net/wireguard/Makefile Tue Apr 23 12:33:44 2019 (r499754)
+++ head/net/wireguard/Makefile Tue Apr 23 12:36:30 2019 (r499755)
@@ -2,6 +2,7 @@
PORTNAME= wireguard
PORTVERSION= 0.0.20190406
+PORTREVISION= 1
CATEGORIES= net
MASTER_SITES= https://git.zx2c4.com/WireGuard/snapshot/
DISTNAME= WireGuard-${PORTVERSION}
Added: head/net/wireguard/files/patch-b3e1a1b07d3631bd816f9bfc27452a89dc29fa28
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/net/wireguard/files/patch-b3e1a1b07d3631bd816f9bfc27452a89dc29fa28 Tue Apr 23 12:36:30 2019 (r499755)
@@ -0,0 +1,65 @@
+From b3e1a1b07d3631bd816f9bfc27452a89dc29fa28 Mon Sep 17 00:00:00 2001
+From: "Jason A. Donenfeld" <Jason at zx2c4.com>
+Date: Sun, 21 Apr 2019 10:11:36 +0900
+Subject: wg-quick: freebsd: workaround SIOCGIFSTATUS race in FreeBSD kernel
+
+---
+ src/tools/wg-quick/freebsd.bash | 31 ++++++++++++++++++++++---------
+ 1 file changed, 22 insertions(+), 9 deletions(-)
+
+diff --git a/src/tools/wg-quick/freebsd.bash b/src/tools/wg-quick/freebsd.bash
+index 9d3a4026..72e0bd04 100755
+--- wg-quick/freebsd.bash
++++ wg-quick/freebsd.bash
+@@ -137,18 +137,30 @@ del_routes() {
+ done
+ }
+
++if_exists() {
++ # HACK: The goal is simply to determine whether or not the interface exists. The
++ # straight-forward way of doing this would be `ifconfig $INTERFACE`, but this
++ # invokes the SIOCGIFSTATUS ioctl, which races with interface shutdown inside
++ # the tun driver, resulting in a kernel panic. So we work around it the stupid
++ # way by using the one utility that appears to call if_nametoindex fairly early
++ # and fails if it doesn't exist: `arp`.
++ if arp -i "$INTERFACE" -a -n >/dev/null 2>&1; then
++ return 0
++ else
++ return 1
++ fi
++}
++
+ del_if() {
+- local line monitor_pid
+ [[ $HAVE_SET_DNS -eq 0 ]] || unset_dns
+- exec 39< <(exec route -n monitor 2>/dev/null)
+- monitor_pid=$!
+ cmd rm -f "/var/run/wireguard/$INTERFACE.sock"
+- while ifconfig "$INTERFACE" >/dev/null 2>&1; do
+- while read -r line; do
+- [[ $line =~ ^RTM_IFANNOUNCE:.* ]] && break
+- done <&39
++ while if_exists; do
++ # HACK: it would be nice to `route monitor` here and wait for RTM_IFANNOUNCE
++ # but it turns out that the announcement is made before the interface
++ # disappears so we sometimes get a hang. So, we're instead left with polling
++ # in a sleep loop like this.
++ sleep 0.1
+ done
+- kill $monitor_pid
+ }
+
+ up_if() {
+@@ -274,7 +286,8 @@ monitor_daemon() {
+ # endpoints change.
+ while read -r event; do
+ [[ $event == RTM_* ]] || continue
+- ifconfig "$INTERFACE" >/dev/null 2>&1 || break
++ [[ -e /var/run/wireguard/$INTERFACE.sock ]] || break
++ if_exists || 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
+--
+cgit v1.2.1-20-gc37e
+
More information about the svn-ports-head
mailing list