From d013d9022a816dbb2b12fbb336371c2e0f9cc1a4 Mon Sep 17 00:00:00 2001 From: Guy Helmer Date: Thu, 23 May 2013 21:33:10 +0000 Subject: [PATCH] While waiting for the bpf hold buffer to become idle, check the return value from mtx_sleep() and exit bpfread() on errors such as EINTR. Reviewed by: jhb --- sys/net/bpf.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sys/net/bpf.c b/sys/net/bpf.c index ce83e4aad27..cb3ed2716a5 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -856,9 +856,14 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) callout_stop(&d->bd_callout); timed_out = (d->bd_state == BPF_TIMED_OUT); d->bd_state = BPF_IDLE; - while (d->bd_hbuf_in_use) - mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock, + while (d->bd_hbuf_in_use) { + error = mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock, PRINET|PCATCH, "bd_hbuf", 0); + if (error != 0) { + BPFD_UNLOCK(d); + return (error); + } + } /* * If the hold buffer is empty, then do a timed sleep, which * ends when the timeout expires or when enough packets