From owner-svn-soc-all@FreeBSD.ORG Mon Jul 2 12:12:19 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 1E2D41065673 for ; Mon, 2 Jul 2012 12:12:17 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Mon, 02 Jul 2012 12:12:17 +0000 Date: Mon, 02 Jul 2012 12:12:17 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120702121217.1E2D41065673@hub.freebsd.org> Cc: Subject: socsvn commit: r238799 - soc2012/gpf/pefs_kmod/sys/fs/pefs X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Jul 2012 12:12:19 -0000 Author: gpf Date: Mon Jul 2 12:12:16 2012 New Revision: 238799 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238799 Log: - if pefs_ioctl is called to retrieve name checksum (MAC) but the vnode has no keys, then the call to pefs_eccn_lookup() will result in a page fault kernel panic. fix the code's behavior for this case by avoiding the call of pefs_eccn_lookup(). Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Modified: soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c ============================================================================== --- soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Mon Jul 2 11:46:47 2012 (r238798) +++ soc2012/gpf/pefs_kmod/sys/fs/pefs/pefs_vnops.c Mon Jul 2 12:12:16 2012 (r238799) @@ -2557,23 +2557,30 @@ } pefs_enccn_init(&enccn); - - cn.cn_nameiop = LOOKUP; - cn.cn_thread = td; - cn.cn_cred = cred; - cn.cn_lkflags = 0; - cn.cn_flags = 0; - cn.cn_nameptr = xncs->pxnc_filename; - cn.cn_namelen = xncs->pxnc_namelen; - - /* XXXgpf: does this lookup rely solely on present cache data? */ - error = pefs_enccn_lookup(&enccn, vp, &cn); + if (pefs_no_keys(vp)) { + enc = xncs->pxnc_filename; + enc_len = xncs->pxnc_namelen; + error = 0; + } + else { + cn.cn_nameiop = LOOKUP; + cn.cn_thread = td; + cn.cn_cred = cred; + cn.cn_lkflags = 0; + cn.cn_flags = 0; + cn.cn_nameptr = xncs->pxnc_filename; + cn.cn_namelen = xncs->pxnc_namelen; + + /* XXXgpf: does this lookup rely solely on present cache data? */ + error = pefs_enccn_lookup(&enccn, vp, &cn); + if (error == 0) { + enc = enccn.pec_cn.cn_nameptr; + enc_len = enccn.pec_cn.cn_namelen; + } + } VOP_UNLOCK(vp, 0); if (error == 0) { - enc = enccn.pec_cn.cn_nameptr; - enc_len = enccn.pec_cn.cn_namelen; - if (enc[0] != '.' || enc_len <= 1) { pefs_enccn_free(&enccn); error = EINVAL;