PERFORCE change 105351 for review
Todd Miller
millert at FreeBSD.org
Wed Aug 30 20:33:03 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=105351
Change 105351 by millert at millert_g4tower on 2006/08/30 20:29:41
Fix error cleanup when trying to mount with an invalid
label. There were two problems. One is a simple memory
leak. The other is more complicated and described below:
When mounting a filesystem in non-update mode we need to
decrement the reference count on error that we incremented
earlier. However, at the point at which the MAC errors can
occur we can't tell whether we need to do that cleanup or
not w/o first checking the user flags and making sure devpath
is non-NULL. As such it is simplest to just put the checks
at the out3 label and use that as the goto target on error.
These checks were not needed in the vendor code since the
only "goto out3" calls occur in a code path where the user
flags and devpath have already been checked.
Affected files ...
.. //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_syscalls.c#2 edit
Differences ...
==== //depot/projects/trustedbsd/sedarwin8/darwin/xnu/bsd/vfs/vfs_syscalls.c#2 (text+ko) ====
@@ -522,28 +522,29 @@
if ((uap->flags & MNT_UPDATE) != 0) {
error = mac_check_mount_fs_relabel(kauth_cred_get(), mp);
if (error != 0)
- goto out1;
+ goto out3;
}
error = copyin(CAST_USER_ADDR_T(uap->mac_p), (caddr_t)&mac,
sizeof(mac));
if (error != 0)
- goto out1;
+ goto out3;
if ((mac.m_buflen > MAC_MAX_LABEL_BUF_LEN) ||
(mac.m_buflen < 2)) {
error = EINVAL;
- goto out1;
+ goto out3;
}
MALLOC(labelstr, char *, mac.m_buflen, M_MACTEMP, M_WAITOK);
error = copyinstr(CAST_USER_ADDR_T(mac.m_string), labelstr,
mac.m_buflen, &ulen);
if (error != 0) {
FREE(labelstr, M_MACTEMP);
- goto out1;
+ goto out3;
+ }
+ error = mac_internalize_mount_label(mp->mnt_mntlabel, labelstr);
+ if (error != 0) {
+ FREE(labelstr, M_MACTEMP);
+ goto out3;
}
- error = mac_internalize_mount_fs_label(mp->mnt_fslabel, labelstr);
- if (error != 0)
- goto out1;
- FREE(labelstr, M_MACTEMP);
}
#endif
/*
@@ -575,13 +576,13 @@
error = VFS_ROOT(mp, &rvp, &context);
if (error) {
printf("%s() VFS_ROOT returned %d\n", __func__, error);
- goto out2;
+ goto out3;
}
/* VFS_ROOT provides reference so needref = 0 */
error = vnode_label(mp, NULL, rvp, NULL, 0, &context);
if (error)
- goto out2;
+ goto out3;
}
#endif /* MAC */
@@ -650,7 +651,8 @@
return(error);
out3:
- vnode_rele(devvp);
+ if (devpath && ((uap->flags & MNT_UPDATE) == 0))
+ vnode_rele(devvp);
out2:
if (devpath && devvp)
vnode_put(devvp);
More information about the trustedbsd-cvs
mailing list