diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-05-02 19:56:54 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-05-02 20:17:18 +0200 |
commit | 24c418a7ad7240143671f41d2db2093f93a64da0 (patch) | |
tree | 920781c92788fb23ac93856355526d6a2d0cfc14 | |
parent | if_wg: don't memcpy data for no reason (diff) | |
download | wireguard-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>
-rw-r--r-- | src/if_wg.c | 17 |
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) { |