svn commit: r357233 - head/sys/net
Kristof Provost
kp at FreeBSD.org
Sat Feb 1 19:27:06 UTC 2020
On 30 Jan 2020, at 16:34, Gleb Smirnoff wrote:
> On Tue, Jan 28, 2020 at 10:44:25PM +0000, Kristof Provost wrote:
> K> Author: kp
> K> Date: Tue Jan 28 22:44:24 2020
> K> New Revision: 357233
> K> URL: https://svnweb.freebsd.org/changeset/base/357233
> K>
> K> Log:
> K> epair: Do not abuse params to register the second interface
> K>
> K> if_epair used the 'params' argument to pass a pointer to the b
> interface
> K> through if_clone_create().
> K> This pointer can be controlled by userspace, which means it could
> be abused to
> K> trigger a panic. While this requires PRIV_NET_IFCREATE
> K> privileges those are assigned to vnet jails, which means that
> vnet jails
> K> could panic the system.
> K>
> K> Reported by: Ilja Van Sprundel <ivansprundel at ioactive.com>
> ...
> K> Modified: head/sys/net/if_clone.h
> K>
> ==============================================================================
> K> --- head/sys/net/if_clone.h Tue Jan 28 21:46:59 2020 (r357232)
> K> +++ head/sys/net/if_clone.h Tue Jan 28 22:44:24 2020 (r357233)
> K> @@ -79,7 +79,8 @@ int if_clone_list(struct if_clonereq *);
> K> struct if_clone *if_clone_findifc(struct ifnet *);
> K> void if_clone_addgroup(struct ifnet *, struct if_clone *);
> K>
> K> -/* The below interface used only by epair(4). */
> K> +/* The below interfaces are used only by epair(4). */
> K> +void if_clone_addif(struct if_clone *, struct ifnet *);
> K> int if_clone_destroyif(struct if_clone *, struct ifnet *);
>
> IMHO, makes sense to move all these declaration into if_epair.c
> itself.
>
Yeah, that does make sense.
One minor issue is that it turns out that if_clone_destroyif() isn’t
just used by if_epair, but also by the wifi code.
How does this look?
diff --git a/sys/net/if_clone.c b/sys/net/if_clone.c
index acc392ead16..452605b0464 100644
--- a/sys/net/if_clone.c
+++ b/sys/net/if_clone.c
@@ -106,6 +106,9 @@ static int ifc_simple_match(struct if_clone *,
const char *);
static int ifc_simple_create(struct if_clone *, char *, size_t,
caddr_t);
static int ifc_simple_destroy(struct if_clone *, struct ifnet *);
+/* The below interface is used only by epair(4). */
+void if_clone_addif(struct if_clone *, struct ifnet *);
+
static struct mtx if_cloners_mtx;
MTX_SYSINIT(if_cloners_lock, &if_cloners_mtx, "if_cloners lock",
MTX_DEF);
VNET_DEFINE_STATIC(int, if_cloners_count);
diff --git a/sys/net/if_clone.h b/sys/net/if_clone.h
index ed7d6f4d02d..c1ddf89c72d 100644
--- a/sys/net/if_clone.h
+++ b/sys/net/if_clone.h
@@ -79,8 +79,7 @@ int if_clone_list(struct if_clonereq *);
struct if_clone *if_clone_findifc(struct ifnet *);
void if_clone_addgroup(struct ifnet *, struct if_clone *);
-/* The below interfaces are used only by epair(4). */
-void if_clone_addif(struct if_clone *, struct ifnet *);
+/* The below interface is used only by epair(4) and ieee80211. */
int if_clone_destroyif(struct if_clone *, struct ifnet *);
#endif /* _KERNEL */
diff --git a/sys/net/if_epair.c b/sys/net/if_epair.c
index 376bdbe9117..7eff03b840f 100644
--- a/sys/net/if_epair.c
+++ b/sys/net/if_epair.c
@@ -94,6 +94,9 @@ SYSCTL_INT(_net_link_epair, OID_AUTO, epair_debug,
CTLFLAG_RW,
#define DPRINTF(fmt, arg...)
#endif
+/* if_clone private function, just for us. */
+extern void if_clone_addif(struct if_clone *, struct ifnet *);
+
static void epair_nh_sintr(struct mbuf *);
static struct mbuf *epair_nh_m2cpuid(struct mbuf *, uintptr_t, u_int
*);
static void epair_nh_drainedcpu(u_int);
Best regards,
Kristof
More information about the svn-src-head
mailing list