Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Aug 2022 20:47:21 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 220818ac0307 - main - bpf: Fix BIOCPROMISC locking
Message-ID:  <202208052047.275KlLWG070656@gitrepo.freebsd.org>

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

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

commit 220818ac030726c24cbf9df6df5c9d019993b875
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-08-05 20:25:05 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-08-05 20:26:34 +0000

    bpf: Fix BIOCPROMISC locking
    
    BPF might put an interface in promiscuous mode when handling the
    BIOCSDLT ioctl.  When this happens, a flag is set in the BPF descriptor
    so that the old interface can be restored when the BPF descriptor is
    destroyed.
    
    The BIOCPROMISC ioctl can also be used to put a BPF descriptor's
    interface into promiscuous mode, but there was nothing synchronizing the
    flag.  Fix this by modifying the ioctl handler to acquire the global BPF
    mutex, which is used to synchronize ifpromisc() calls elsewhere in BPF.
    
    Reviewed by:    kp, melifaro
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D36045
---
 sys/net/bpf.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index 2a390c1e7d30..4c8c77d1e948 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -1515,18 +1515,18 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
 	 * Put interface into promiscuous mode.
 	 */
 	case BIOCPROMISC:
+		BPF_LOCK();
 		if (d->bd_bif == NULL) {
 			/*
 			 * No interface attached yet.
 			 */
 			error = EINVAL;
-			break;
-		}
-		if (d->bd_promisc == 0) {
+		} else if (d->bd_promisc == 0) {
 			error = ifpromisc(d->bd_bif->bif_ifp, 1);
 			if (error == 0)
 				d->bd_promisc = 1;
 		}
+		BPF_UNLOCK();
 		break;
 
 	/*



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