Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Mar 2021 10:53:13 GMT
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: bae59285f932 - main - if_wg: return to m_defrag() of incoming mbuf, sans leak
Message-ID:  <202103091053.129ArDuX015072@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=bae59285f932d59ee9fd9d6a7c41d34ef8e51186

commit bae59285f932d59ee9fd9d6a7c41d34ef8e51186
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2021-03-09 10:44:31 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2021-03-09 10:52:22 +0000

    if_wg: return to m_defrag() of incoming mbuf, sans leak
    
    This partially reverts df55485085 but still fixes the leak. It was
    overlooked (sigh) that some packets will exceed MHLEN and cannot be
    physically contiguous without clustering, but we don't actually need
    it to be. m_defrag() should pull up enough for any of the headers that
    we do need to be accessible.
    
    Fixes:  df55485085
    Pointy hat;     kevans
---
 sys/dev/if_wg/module/if_wg_session.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sys/dev/if_wg/module/if_wg_session.c b/sys/dev/if_wg/module/if_wg_session.c
index e63367785ed3..ae9e44cffef5 100644
--- a/sys/dev/if_wg/module/if_wg_session.c
+++ b/sys/dev/if_wg/module/if_wg_session.c
@@ -1904,13 +1904,12 @@ wg_input(struct mbuf *m0, int offset, struct inpcb *inpcb,
 	m_adj(m0, hlen);
 
 	/*
-	 * Ensure mbuf is contiguous over full length of the packet.  This is
-	 * done so that we can directly read the handshake values in
-	 * wg_handshake, and so we can decrypt a transport packet by passing a
-	 * a single buffer to noise_remote_decrypt() in wg_decap.
+	 * Ensure mbuf has at least enough contiguous data to peel off our
+	 * headers at the beginning.
 	 */
-	if ((m = m_pullup(m0, m0->m_pkthdr.len)) == NULL) {
+	if ((m = m_defrag(m0, M_NOWAIT)) == NULL) {
 		DPRINTF(sc, "DEFRAG fail\n");
+		m_freem(m0);
 		return;
 	}
 	data = mtod(m, void *);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103091053.129ArDuX015072>