From owner-svn-src-head@FreeBSD.ORG Tue Nov 6 21:07:05 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5827D90E; Tue, 6 Nov 2012 21:07:05 +0000 (UTC) (envelope-from ghelmer@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 3DC1D8FC08; Tue, 6 Nov 2012 21:07:05 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qA6L75Sc049710; Tue, 6 Nov 2012 21:07:05 GMT (envelope-from ghelmer@svn.freebsd.org) Received: (from ghelmer@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qA6L75At049708; Tue, 6 Nov 2012 21:07:05 GMT (envelope-from ghelmer@svn.freebsd.org) Message-Id: <201211062107.qA6L75At049708@svn.freebsd.org> From: Guy Helmer Date: Tue, 6 Nov 2012 21:07:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r242673 - head/sys/net X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Nov 2012 21:07:05 -0000 Author: ghelmer Date: Tue Nov 6 21:07:04 2012 New Revision: 242673 URL: http://svnweb.freebsd.org/changeset/base/242673 Log: Work around a race in bpfread() by validating the hold buffer pointer before freeing it. Otherwise, we can lose a buffer and cause a panic in catchpacket(). Modified: head/sys/net/bpf.c Modified: head/sys/net/bpf.c ============================================================================== --- head/sys/net/bpf.c Tue Nov 6 20:30:23 2012 (r242672) +++ head/sys/net/bpf.c Tue Nov 6 21:07:04 2012 (r242673) @@ -954,10 +954,13 @@ bpfread(struct cdev *dev, struct uio *ui error = bpf_uiomove(d, d->bd_hbuf, d->bd_hlen, uio); BPFD_LOCK(d); - d->bd_fbuf = d->bd_hbuf; - d->bd_hbuf = NULL; - d->bd_hlen = 0; - bpf_buf_reclaimed(d); + if (d->bd_hbuf != NULL) { + /* Free the hold buffer only if it is still valid. */ + d->bd_fbuf = d->bd_hbuf; + d->bd_hbuf = NULL; + d->bd_hlen = 0; + bpf_buf_reclaimed(d); + } BPFD_UNLOCK(d); return (error);