Date: Sat, 24 Sep 2011 04:19:53 -0400 From: Arnaud Lacombe <lacombar@gmail.com> To: zec@FreeBSD.org, Julian Elischer <julian@freebsd.org> Cc: freebsd-net@freebsd.org Subject: VNET mismanagement in bpf(4) ? Message-ID: <CACqU3MWaNxM3-N4qURzZs5NMVeETzXM59qu-24zW%2BEuqfY=2CQ@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi, It seems to me there is a VNET mismanagement in `net/bpf.c'; we have: static void bpf_detachd(struct bpf_d *d) { [...] if (d->bd_promisc) { d->bd_promisc = 0; CURVNET_SET(ifp->if_vnet); error = ifpromisc(ifp, 0); CURVNET_RESTORE(); [...] } which is called by either bpfdetach() or bpf_setdlt(). Here is the relevant code block of the latter: static int bpf_setdlt(struct bpf_d *d, u_int dlt) { [...] if (bp != NULL) { opromisc = d->bd_promisc; bpf_detachd(d); bpf_attachd(d, bp); BPFD_LOCK(d); reset_d(d); BPFD_UNLOCK(d); if (opromisc) { error = ifpromisc(bp->bif_ifp, 1); if (error) if_printf(bp->bif_ifp, "bpf_setdlt: ifpromisc failed (%d)\n", error); else d->bd_promisc = 1; } [...] } I would guess that there is no need to `CURVNET_SET(ifp->if_vnet);' before calling `ifpromisc()' because it has already been done in `bpfioctl()': static int bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td) { [...] CURVNET_SET(TD_TO_VNET(td)); [...] /* * Set data link type. */ case BIOCSDLT: if (d->bd_bif == NULL) error = EINVAL; else error = bpf_setdlt(d, *(u_int *)addr); break; [...] CURVNET_RESTORE(); return (error); } However, the following call path: bpfioctl() -> bpf_setdlt() -> bpf_detachd() -> [ret] bpf_setdlt() -> [ret] bpfioctl() [ret] will end up in the following sequence of VNET setting/restore: bpfioctl():CURVNET_SET(TD_TO_VNET(td)) -> bpf_detachd():CURVNET_SET(ifp->if_vnet) -> bpf_detachd():CURVNET_RESTORE() -> bpfioctl():CURVNET_RESTORE() leading to the lost of the original VNET, from bpfioctl(). Am I missing something ? Thanks, - Arnaud
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACqU3MWaNxM3-N4qURzZs5NMVeETzXM59qu-24zW%2BEuqfY=2CQ>