aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-05-02 19:56:54 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-05-02 20:17:18 +0200
commit24c418a7ad7240143671f41d2db2093f93a64da0 (patch)
tree920781c92788fb23ac93856355526d6a2d0cfc14 /src
parentif_wg: don't memcpy data for no reason (diff)
downloadwireguard-freebsd-24c418a7ad7240143671f41d2db2093f93a64da0.tar.xz
wireguard-freebsd-24c418a7ad7240143671f41d2db2093f93a64da0.zip
if_wg: ensure packet is not shared before writing
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src')
-rw-r--r--src/if_wg.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/if_wg.c b/src/if_wg.c
index a373958..465b493 100644
--- a/src/if_wg.c
+++ b/src/if_wg.c
@@ -1965,6 +1965,11 @@ wg_input(struct mbuf *m, int offset, struct inpcb *inpcb,
defragged = m_defrag(m, M_NOWAIT);
if (defragged)
m = defragged;
+ m = m_unshare(m, M_NOWAIT);
+ if (!m) {
+ if_inc_counter(sc->sc_ifp, IFCOUNTER_IQDROPS, 1);
+ return;
+ }
/* Caller provided us with `sa`, no need for this header. */
m_adj(m, offset + sizeof(struct udphdr));
@@ -2087,7 +2092,7 @@ xmit_err(struct ifnet *ifp, struct mbuf *m, struct wg_packet *pkt, sa_family_t a
}
if (pkt)
wg_packet_free(pkt);
- else
+ else if (m)
m_freem(m);
}
@@ -2187,6 +2192,11 @@ wg_transmit(struct ifnet *ifp, struct mbuf *m)
defragged = m_defrag(m, M_NOWAIT);
if (defragged)
m = defragged;
+ m = m_unshare(m, M_NOWAIT);
+ if (!m) {
+ xmit_err(ifp, m, NULL, AF_UNSPEC);
+ return (ENOBUFS);
+ }
ret = determine_af_and_pullup(&m, &af);
if (ret) {
@@ -2216,6 +2226,11 @@ wg_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, struct
defragged = m_defrag(m, M_NOWAIT);
if (defragged)
m = defragged;
+ m = m_unshare(m, M_NOWAIT);
+ if (!m) {
+ xmit_err(ifp, m, NULL, AF_UNSPEC);
+ return (ENOBUFS);
+ }
ret = determine_af_and_pullup(&m, &parsed_af);
if (ret) {