From owner-svn-src-head@FreeBSD.ORG Thu Nov 12 15:19:28 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 87A7C1065703; Thu, 12 Nov 2009 15:19:28 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 5B4858FC1A; Thu, 12 Nov 2009 15:19:28 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id E05B146B06; Thu, 12 Nov 2009 10:19:27 -0500 (EST) Received: from jhbbsd.hudson-trading.com (unknown [209.249.190.8]) by bigwig.baldwin.cx (Postfix) with ESMTPA id 2CE118A020; Thu, 12 Nov 2009 10:19:27 -0500 (EST) From: John Baldwin To: Xin LI Date: Thu, 12 Nov 2009 10:14:12 -0500 User-Agent: KMail/1.9.7 References: <200911112130.nABLUw9b007768@svn.freebsd.org> In-Reply-To: <200911112130.nABLUw9b007768@svn.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911121014.12391.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.0.1 (bigwig.baldwin.cx); Thu, 12 Nov 2009 10:19:27 -0500 (EST) X-Virus-Scanned: clamav-milter 0.95.1 at bigwig.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-2.5 required=4.2 tests=AWL,BAYES_00,RDNS_NONE autolearn=no version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on bigwig.baldwin.cx Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r199201 - in head: contrib/libpcap sbin/ifconfig share/man/man4 sys/kern sys/net sys/sys X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 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: Thu, 12 Nov 2009 15:19:28 -0000 On Wednesday 11 November 2009 4:30:58 pm Xin LI wrote: > Author: delphij > Date: Wed Nov 11 21:30:58 2009 > New Revision: 199201 > URL: http://svn.freebsd.org/changeset/base/199201 > > Log: > Add interface description capability as inspired by OpenBSD. > > MFC after: 3 months > > Modified: head/sys/net/if.c > ============================================================================== > --- head/sys/net/if.c Wed Nov 11 21:18:27 2009 (r199200) > +++ head/sys/net/if.c Wed Nov 11 21:30:58 2009 (r199201) > @@ -2090,6 +2092,45 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, > ifr->ifr_phys = ifp->if_physical; > break; > > + case SIOCSIFDESCR: > + error = priv_check(td, PRIV_NET_SETIFDESCR); > + if (error) > + return (error); > + > + IF_AFDATA_WLOCK(ifp); > + if (ifp->if_description == NULL) { > + ifp->if_description = sbuf_new_auto(); > + if (ifp->if_description == NULL) { > + error = ENOMEM; > + IF_AFDATA_WUNLOCK(ifp); > + break; > + } > + } else > + sbuf_clear(ifp->if_description); > + > + if (sbuf_copyin(ifp->if_description, ifr->ifr_buffer.buffer, > + ifr->ifr_buffer.length) == -1) > + error = EFAULT; > + > + if (error == 0) { > + sbuf_finish(ifp->if_description); > + getmicrotime(&ifp->if_lastchange); > + } > + IF_AFDATA_WUNLOCK(ifp); Since IF_AFDATA isn't a sleepable lock (e.g. an sx lock), it is not safe to do a copyin() while holding this lock. A better approach would probably be something like: struct sbuf *new, *old; case SIOCSIFDESCR: /* priv check */ new = sbuf_new_auto(); if (new == NULL) return (ENOMEM); if (sbuf_copyin(new, ifr->ifr_buffer.buffer, ifr->ifr_buffer.length) == -1) { sbuf_delete(new); return (EFAULT); } IF_AFDATA_WLOCK(ifp); old = ifp->if_description; ifp->if_description = new; getmicrotime(&ifp->if_lastchange); IF_AFDATA_WUNLOCK(ifp); if (old != NULL) sbuf_delete(old); break; -- John Baldwin