summaryrefslogtreecommitdiffhomepage
path: root/src/tests
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-06-21 21:42:21 -0600
committerJason A. Donenfeld <Jason@zx2c4.com>2020-06-22 00:02:35 -0600
commitb8fbf4f4803ca1b2fa181ca3d2555cdb61f6f374 (patch)
treec4b486ce30f07613775b9bd743ab8d98c7e6cd41 /src/tests
parentc5e19b2939d490e23b0d0ab19cdef14442910ab7 (diff)
device: avoid circular netns references
Before, we took a reference to the creating netns if the new netns was different. This caused issues with circular references, with two wireguard interfaces swapping namespaces. The solution is to rather not take any extra references at all, but instead simply invalidate the creating netns pointer when that netns is deleted. In order to prevent this from happening again, this commit improves the rough object leak tracking by allowing it to account for created and destroyed interfaces, aside from just peers and keys. That then makes it possible to check for the object leak when having two interfaces take a reference to each others' namespaces. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/tests')
-rwxr-xr-xsrc/tests/netns.sh13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/tests/netns.sh b/src/tests/netns.sh
index e4dc485..11fd7f6 100755
--- a/src/tests/netns.sh
+++ b/src/tests/netns.sh
@@ -590,9 +590,20 @@ ip0 link set wg0 up
kill $ncat_pid
ip0 link del wg0
+# Ensure there aren't circular reference loops
+ip1 link add wg1 type wireguard
+ip2 link add wg2 type wireguard
+ip1 link set wg1 netns $netns2
+ip2 link set wg2 netns $netns1
+pp ip netns delete $netns1
+pp ip netns delete $netns2
+pp ip netns add $netns1
+pp ip netns add $netns2
+
+sleep 2 # Wait for cleanup and grace periods
declare -A objects
while read -t 0.1 -r line 2>/dev/null || [[ $? -ne 142 ]]; do
- [[ $line =~ .*(wg[0-9]+:\ [A-Z][a-z]+\ [0-9]+)\ .*(created|destroyed).* ]] || continue
+ [[ $line =~ .*(wg[0-9]+:\ [A-Z][a-z]+\ ?[0-9]*)\ .*(created|destroyed).* ]] || continue
objects["${BASH_REMATCH[1]}"]+="${BASH_REMATCH[2]}"
done < /dev/kmsg
alldeleted=1