Module Name:    src
Committed By:   riastradh
Date:           Tue Oct  8 02:29:40 UTC 2024

Modified Files:
        src/sys/net: if_wg.c
        src/tests/net/if_wg: t_basic.sh

Log Message:
wg(4): Fix wg_overudp_cb drop paths to null out *mp as caller needs.

PR kern/58688: userland panic of kernel via wg(4)


To generate a diff of this commit:
cvs rdiff -u -r1.131 -r1.132 src/sys/net/if_wg.c
cvs rdiff -u -r1.5 -r1.6 src/tests/net/if_wg/t_basic.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_wg.c
diff -u src/sys/net/if_wg.c:1.131 src/sys/net/if_wg.c:1.132
--- src/sys/net/if_wg.c:1.131	Wed Jul 31 00:26:01 2024
+++ src/sys/net/if_wg.c	Tue Oct  8 02:29:40 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_wg.c,v 1.131 2024/07/31 00:26:01 riastradh Exp $	*/
+/*	$NetBSD: if_wg.c,v 1.132 2024/10/08 02:29:40 riastradh Exp $	*/
 
 /*
  * Copyright (C) Ryota Ozaki <ozaki.ry...@gmail.com>
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.131 2024/07/31 00:26:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wg.c,v 1.132 2024/10/08 02:29:40 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_altq_enabled.h"
@@ -3662,6 +3662,24 @@ wg_so_upcall(struct socket *so, void *co
 	mutex_exit(wg->wg_intr_lock);
 }
 
+/*
+ * wg_overudp_cb(&m, offset, so, src, arg)
+ *
+ *	Callback for incoming UDP packets in high-priority
+ *	packet-processing path.
+ *
+ *	Three cases:
+ *
+ *	- Data packet.  Consumed here for high-priority handling.
+ *	  => Returns 1 and takes ownership of m.
+ *
+ *	- Handshake packet.  Defer to thread context via so_receive in
+ *	  wg_receive_packets.
+ *	  => Returns 0 and leaves caller with ownership of m.
+ *
+ *	- Invalid.  Dropped on the floor and freed.
+ *	  => Returns -1 and takes ownership of m (frees m).
+ */
 static int
 wg_overudp_cb(struct mbuf **mp, int offset, struct socket *so,
     struct sockaddr *src, void *arg)
@@ -3677,7 +3695,8 @@ wg_overudp_cb(struct mbuf **mp, int offs
 	if (__predict_false(m_length(m) - offset < sizeof(struct wg_msg))) {
 		/* drop on the floor */
 		m_freem(m);
-		return -1;
+		*mp = NULL;
+		return -1;	/* dropped */
 	}
 
 	/*
@@ -3699,21 +3718,24 @@ wg_overudp_cb(struct mbuf **mp, int offs
 		m_adj(m, offset);
 		if (__predict_false(m->m_len < sizeof(struct wg_msg_data))) {
 			m = m_pullup(m, sizeof(struct wg_msg_data));
-			if (m == NULL)
-				return -1;
+			if (m == NULL) {
+				*mp = NULL;
+				return -1; /* dropped */
+			}
 		}
 		wg_handle_msg_data(wg, m, src);
 		*mp = NULL;
-		return 1;
+		return 1;	/* consumed */
 	case WG_MSG_TYPE_INIT:
 	case WG_MSG_TYPE_RESP:
 	case WG_MSG_TYPE_COOKIE:
 		/* pass through to so_receive in wg_receive_packets */
-		return 0;
+		return 0;	/* passthrough */
 	default:
 		/* drop on the floor */
 		m_freem(m);
-		return -1;
+		*mp = NULL;
+		return -1;	/* dropped */
 	}
 }
 

Index: src/tests/net/if_wg/t_basic.sh
diff -u src/tests/net/if_wg/t_basic.sh:1.5 src/tests/net/if_wg/t_basic.sh:1.6
--- src/tests/net/if_wg/t_basic.sh:1.5	Tue Oct  8 02:28:43 2024
+++ src/tests/net/if_wg/t_basic.sh	Tue Oct  8 02:29:40 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: t_basic.sh,v 1.5 2024/10/08 02:28:43 riastradh Exp $
+#	$NetBSD: t_basic.sh,v 1.6 2024/10/08 02:29:40 riastradh Exp $
 #
 # Copyright (c) 2018 Ryota Ozaki <ozaki.ry...@gmail.com>
 # All rights reserved.
@@ -60,8 +60,6 @@ check_badudp()
 	else
 		atf_check -o ignore -e ignore \
 		    $HIJACKING nc -6uv -w1 $ip $port </dev/null
-		atf_expect_fail "PR kern/58688:" \
-		    " userland panic of kernel via wg(4)"
 	fi
 }
 

Reply via email to