Date: Tue, 3 Feb 1998 21:31:30 +0900 (JST) From: kato@migmatite.eps.nagoya-u.ac.jp To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: kern/5632: pagefault in umap_bypass() and umap_mapids() Message-ID: <199802031231.VAA00361@marble.eps.nagoya-u.ac.jp>
next in thread | raw e-mail | index | archive | help
>Number: 5632
>Category: kern
>Synopsis: pagefault in umap_bypass() when cred == NOCRED.
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Feb 3 05:00:01 PST 1998
>Last-Modified:
>Originator: KATO Takenori
>Organization:
Dept. Earth Plarnet. Sci, Nagoya Univ.
>Release: FreeBSD 3.0-CURRENT i386
>Environment:
current & RELENG_2_2
>Description:
Because umap_bypass() and umap_mapids() do not check whether the
pointer to credential is NOCRED or not, pagefault occurs in those
functions. For exapmle, vclean calls vinbalbuf at cred = NOCRED and
vinvalbuf calls VOP_FSYNC(). In this case, pointer to credential is
NOCRED, but umap_bypass() always calls crdup(), which assumes the
pointer to credential is not NOCRED. The umap_mapids also assumes
that the pointer to credential is not NOCRED.
>How-To-Repeat:
One example is unmounting umapfs.
>Fix:
Check the pointer to credential as follows:
---------- BEGIN ----------
*** umap_subr.c.ORIG Tue Feb 3 20:41:24 1998
--- umap_subr.c Tue Feb 3 21:03:37 1998
***************
*** 356,361 ****
--- 356,364 ----
uid_t uid;
gid_t gid;
+ if (credp == NOCRED)
+ return;
+
unentries = MOUNTTOUMAPMOUNT(v_mount)->info_nentries;
usermap = &(MOUNTTOUMAPMOUNT(v_mount)->info_mapdata[0][0]);
gnentries = MOUNTTOUMAPMOUNT(v_mount)->info_gnentries;
*** umap_vnops.c.ORIG Tue Feb 3 20:32:02 1998
--- umap_vnops.c Tue Feb 3 20:47:18 1998
***************
*** 149,155 ****
/* Save old values */
savecredp = (*credpp);
! (*credpp) = crdup(savecredp);
credp = *credpp;
if (umap_bug_bypass && credp->cr_uid != 0)
--- 149,156 ----
/* Save old values */
savecredp = (*credpp);
! if (savecredp != NOCRED)
! (*credpp) = crdup(savecredp);
credp = *credpp;
if (umap_bug_bypass && credp->cr_uid != 0)
***************
*** 176,182 ****
compcredp = (*compnamepp)->cn_cred;
savecompcredp = compcredp;
! compcredp = (*compnamepp)->cn_cred = crdup(savecompcredp);
if (umap_bug_bypass && compcredp->cr_uid != 0)
printf("umap_bypass: component credit user was %ld, group %ld\n",
--- 177,185 ----
compcredp = (*compnamepp)->cn_cred;
savecompcredp = compcredp;
! if (savecompcredp != NOCRED)
! (*compnamepp)->cn_cred = crdup(savecompcredp);
! compcredp = (*compnamepp)->cn_cred;
if (umap_bug_bypass && compcredp->cr_uid != 0)
printf("umap_bypass: component credit user was %ld, group %ld\n",
***************
*** 238,248 ****
printf("umap_bypass: returning-user was %ld\n",
credp->cr_uid);
! crfree(credp);
! (*credpp) = savecredp;
! if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
! printf("umap_bypass: returning-user now %ld\n\n",
! (*credpp)->cr_uid);
}
if (descp->vdesc_componentname_offset != VDESC_NO_OFFSET) {
--- 241,253 ----
printf("umap_bypass: returning-user was %ld\n",
credp->cr_uid);
! if (savecredp != NOCRED) {
! crfree(credp);
! (*credpp) = savecredp;
! if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
! printf("umap_bypass: returning-user now %ld\n\n",
! (*credpp)->cr_uid);
! }
}
if (descp->vdesc_componentname_offset != VDESC_NO_OFFSET) {
***************
*** 250,260 ****
printf("umap_bypass: returning-component-user was %ld\n",
compcredp->cr_uid);
! crfree(compcredp);
! (*compnamepp)->cn_cred = savecompcredp;
! if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
! printf("umap_bypass: returning-component-user now %ld\n",
! compcredp->cr_uid);
}
return (error);
--- 255,267 ----
printf("umap_bypass: returning-component-user was %ld\n",
compcredp->cr_uid);
! if (savecompcredp != NOCRED) {
! crfree(compcredp);
! (*compnamepp)->cn_cred = savecompcredp;
! if (umap_bug_bypass && credpp && (*credpp)->cr_uid != 0)
! printf("umap_bypass: returning-component-user now %ld\n",
! compcredp->cr_uid);
! }
}
return (error);
---------- END ----------
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199802031231.VAA00361>
