socsvn commit: r238799 - soc2012/gpf/pefs_kmod/sys/fs/pefs
gpf at FreeBSD.org
gpf at FreeBSD.org
Mon Jul 2 12:12:19 UTC 2012
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;
More information about the svn-soc-all
mailing list