diff options
author | Maxime Henrion <mux@FreeBSD.org> | 2002-03-28 13:47:32 +0000 |
---|---|---|
committer | Maxime Henrion <mux@FreeBSD.org> | 2002-03-28 13:47:32 +0000 |
commit | daab5e247274c98b87cd385283582717730446fa (patch) | |
tree | f5483a5c1b2b711061910b8996d32a18b48b0b46 /sys/kern/vfs_extattr.c | |
parent | 82d0caaef1fe4bbddf4aea352cacace6cccecee3 (diff) | |
download | src-daab5e247274c98b87cd385283582717730446fa.tar.gz src-daab5e247274c98b87cd385283582717730446fa.zip |
- Properly sync vfs_nmount() with changes that have be already done
in vfs_mount(), in particular revisions 1.215, 1.227 and 1.240.
- flag2 is a low quality variable name, change it to kern_flag.
- strncpy NUL-terminates f_fstypename and f_mntonname since the strings
have length <= <buffer length> - 1, so the explicit NUL-termination is
bogus.
- M_ZERO'ing space for fstype and fspath is stupid since we never use the
space beyond the end of the string.
- Do various style(9) cleanups in both functions.
Submitted by: bde
Reviewed by: phk
Notes
Notes:
svn path=/head/; revision=93339
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r-- | sys/kern/vfs_extattr.c | 96 |
1 files changed, 39 insertions, 57 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 3972b1520aa2..9ed164b1937b 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -280,9 +280,10 @@ kernel_vmount(int flags, ...) static int vfs_nmount(td, fsflags, fsoptions) struct thread *td; - int fsflags; /* Flags common to all filesystems */ - struct uio *fsoptions; /* Options local to the filesystem */ + int fsflags; /* Flags common to all filesystems. */ + struct uio *fsoptions; /* Options local to the filesystem. */ { + linker_file_t lf; struct vnode *vp; struct mount *mp; struct vfsconf *vfsp; @@ -290,7 +291,7 @@ vfs_nmount(td, fsflags, fsoptions) struct vfsoptlist *optlist; struct vfsopt *opt; char *buf, *fstype, *fspath; - int error, flag = 0, flag2 = 0, i, len, optcnt; + int error, flag = 0, kern_flag = 0, i, len, optcnt; int offset, iovcnt, fstypelen, fspathlen; struct vattr va; struct nameidata nd; @@ -320,7 +321,7 @@ vfs_nmount(td, fsflags, fsoptions) cur = fsoptions->uio_iov; while (i < optcnt) { opt[i].name = buf + offset; - /* Ensure the name of an option is a string */ + /* Ensure the name of an option is a string. */ if (opt[i].name[cur->iov_len - 1] != '\0') { error = EINVAL; goto bad; @@ -351,13 +352,13 @@ vfs_nmount(td, fsflags, fsoptions) */ fstypelen = 0; error = vfs_getopt(optlist, "fstype", (void **)&fstype, &fstypelen); - if ((error != 0) || (fstype[fstypelen - 1] != '\0')) { + if (error || fstype[fstypelen - 1] != '\0') { error = EINVAL; goto bad; } fspathlen = 0; error = vfs_getopt(optlist, "fspath", (void **)&fspath, &fspathlen); - if ((error != 0) || (fspath[fspathlen - 1] != '\0')) { + if (error || fspath[fspathlen - 1] != '\0') { error = EINVAL; goto bad; } @@ -367,14 +368,13 @@ vfs_nmount(td, fsflags, fsoptions) * variables will fit in our mp buffers, including the * terminating NUL. */ - if ((fstypelen >= MFSNAMELEN - 1) || - (fspathlen >= MNAMELEN - 1)) { + if (fstypelen >= MFSNAMELEN - 1 || fspathlen >= MNAMELEN - 1) { error = ENAMETOOLONG; goto bad; } if (usermount == 0) { - error = suser_td(td); + error = suser_td(td); if (error) goto bad; } @@ -387,9 +387,9 @@ vfs_nmount(td, fsflags, fsoptions) goto bad; } /* - * Silently enforce MNT_NOSUID and MNT_NODEV for non-root users + * Silently enforce MNT_NOSUID and MNT_NODEV for non-root users. */ - if (suser_xxx(td->td_proc->p_ucred, 0, 0)) + if (suser_xxx(td->td_ucred, NULL, 0) != 0) fsflags |= MNT_NOSUID | MNT_NODEV; /* * Get vnode to be covered @@ -407,7 +407,7 @@ vfs_nmount(td, fsflags, fsoptions) } mp = vp->v_mount; flag = mp->mnt_flag; - flag2 = mp->mnt_kern_flag; + kern_flag = mp->mnt_kern_flag; /* * We only allow the filesystem to be reloaded if it * is currently mounted read-only. @@ -422,7 +422,7 @@ vfs_nmount(td, fsflags, fsoptions) * Only root, or the user that did the original mount is * permitted to update it. */ - if (mp->mnt_stat.f_owner != td->td_proc->p_ucred->cr_uid) { + if (mp->mnt_stat.f_owner != td->td_ucred->cr_uid) { error = suser_td(td); if (error) { vput(vp); @@ -435,8 +435,7 @@ vfs_nmount(td, fsflags, fsoptions) goto bad; } mtx_lock(&vp->v_interlock); - if ((vp->v_flag & VMOUNT) != 0 || - vp->v_mountedhere != NULL) { + if ((vp->v_flag & VMOUNT) != 0 || vp->v_mountedhere != NULL) { mtx_unlock(&vp->v_interlock); vfs_unbusy(mp, td); vput(vp); @@ -455,20 +454,19 @@ vfs_nmount(td, fsflags, fsoptions) * If the user is not root, ensure that they own the directory * onto which we are attempting to mount. */ - error = VOP_GETATTR(vp, &va, td->td_proc->p_ucred, td); + error = VOP_GETATTR(vp, &va, td->td_ucred, td); if (error) { vput(vp); goto bad; } - if (va.va_uid != td->td_proc->p_ucred->cr_uid) { + if (va.va_uid != td->td_ucred->cr_uid) { error = suser_td(td); if (error) { vput(vp); goto bad; } } - if ((error = vinvalbuf(vp, V_SAVE, td->td_proc->p_ucred, td, 0, 0)) - != 0) { + if ((error = vinvalbuf(vp, V_SAVE, td->td_ucred, td, 0, 0)) != 0) { vput(vp); goto bad; } @@ -481,16 +479,14 @@ vfs_nmount(td, fsflags, fsoptions) if (!strcmp(vfsp->vfc_name, fstype)) break; if (vfsp == NULL) { - linker_file_t lf; - - /* Only load modules for root (very important!) */ + /* Only load modules for root (very important!). */ error = suser_td(td); if (error) { vput(vp); goto bad; } error = securelevel_gt(td->td_ucred, 0); - if (error != 0) { + if (error) { vput(vp); goto bad; } @@ -502,7 +498,7 @@ vfs_nmount(td, fsflags, fsoptions) goto bad; } lf->userrefs++; - /* lookup again, see if the VFS was loaded */ + /* Look up again to see if the VFS was loaded. */ for (vfsp = vfsconf; vfsp; vfsp = vfsp->vfc_next) if (!strcmp(vfsp->vfc_name, fstype)) break; @@ -514,7 +510,6 @@ vfs_nmount(td, fsflags, fsoptions) goto bad; } } - mtx_lock(&vp->v_interlock); if ((vp->v_flag & VMOUNT) != 0 || vp->v_mountedhere != NULL) { @@ -533,18 +528,16 @@ vfs_nmount(td, fsflags, fsoptions) TAILQ_INIT(&mp->mnt_nvnodelist); TAILQ_INIT(&mp->mnt_reservedvnlist); lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); - vfs_busy(mp, LK_NOWAIT, 0, td); + (void)vfs_busy(mp, LK_NOWAIT, 0, td); mp->mnt_op = vfsp->vfc_vfsops; mp->mnt_vfc = vfsp; vfsp->vfc_refcount++; mp->mnt_stat.f_type = vfsp->vfc_typenum; mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK; strncpy(mp->mnt_stat.f_fstypename, fstype, MFSNAMELEN); - mp->mnt_stat.f_fstypename[MFSNAMELEN - 1] = '\0'; mp->mnt_vnodecovered = vp; - mp->mnt_stat.f_owner = td->td_proc->p_ucred->cr_uid; + mp->mnt_stat.f_owner = td->td_ucred->cr_uid; strncpy(mp->mnt_stat.f_mntonname, fspath, MNAMELEN); - mp->mnt_stat.f_mntonname[MNAMELEN - 1] = '\0'; mp->mnt_iosize_max = DFLTPHYS; VOP_UNLOCK(vp, 0, td); @@ -569,14 +562,8 @@ update: mp->mnt_flag |= MNT_RDONLY; else if (mp->mnt_flag & MNT_RDONLY) mp->mnt_kern_flag |= MNTK_WANTRDWR; - mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV | - MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME | - MNT_NOSYMFOLLOW | MNT_IGNORE | - MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR); - mp->mnt_flag |= fsflags & (MNT_NOSUID | MNT_NOEXEC | - MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_FORCE | - MNT_NOSYMFOLLOW | MNT_IGNORE | - MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR); + mp->mnt_flag &=~ MNT_UPDATEMASK; + mp->mnt_flag |= fsflags & (MNT_UPDATEMASK | MNT_FORCE); /* * Mount the filesystem. * XXX The final recipients of VFS_MOUNT just overwrite the ndp they @@ -591,7 +578,7 @@ update: mp->mnt_kern_flag &=~ MNTK_WANTRDWR; if (error) { mp->mnt_flag = flag; - mp->mnt_kern_flag = flag2; + mp->mnt_kern_flag = kern_flag; vfs_freeopts(mp->mnt_optnew); } else { vfs_freeopts(mp->mnt_opt); @@ -656,7 +643,7 @@ bad: } /* - * Old Mount API + * Old Mount API. */ #ifndef _SYS_SYSPROTO_H_ struct mount_args { @@ -681,8 +668,8 @@ mount(td, uap) char *fspath; int error; - fstype = malloc(MFSNAMELEN, M_TEMP, M_WAITOK | M_ZERO); - fspath = malloc(MNAMELEN, M_TEMP, M_WAITOK | M_ZERO); + fstype = malloc(MFSNAMELEN, M_TEMP, M_WAITOK); + fspath = malloc(MNAMELEN, M_TEMP, M_WAITOK); /* * vfs_mount() actually takes a kernel string for `type' and @@ -718,21 +705,20 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) int fsflags; void *fsdata; { + linker_file_t lf; struct vnode *vp; struct mount *mp; struct vfsconf *vfsp; - int error, flag = 0, flag2 = 0; + int error, flag = 0, kern_flag = 0; struct vattr va; struct nameidata nd; - linker_file_t lf; /* * Be ultra-paranoid about making sure the type and fspath * variables will fit in our mp buffers, including the * terminating NUL. */ - if ((strlen(fstype) >= MFSNAMELEN - 1) || - (strlen(fspath) >= MNAMELEN - 1)) + if (strlen(fstype) >= MFSNAMELEN || strlen(fspath) >= MNAMELEN) return (ENAMETOOLONG); if (usermount == 0) { @@ -749,9 +735,9 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) return (error); } /* - * Silently enforce MNT_NOSUID and MNT_NODEV for non-root users + * Silently enforce MNT_NOSUID and MNT_NODEV for non-root users. */ - if (suser_xxx(td->td_ucred, 0, 0)) + if (suser_xxx(td->td_ucred, NULL, 0) != 0) fsflags |= MNT_NOSUID | MNT_NODEV; /* * Get vnode to be covered @@ -768,7 +754,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) } mp = vp->v_mount; flag = mp->mnt_flag; - flag2 = mp->mnt_kern_flag; + kern_flag = mp->mnt_kern_flag; /* * We only allow the filesystem to be reloaded if it * is currently mounted read-only. @@ -794,8 +780,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) return (EBUSY); } mtx_lock(&vp->v_interlock); - if ((vp->v_flag & VMOUNT) != 0 || - vp->v_mountedhere != NULL) { + if ((vp->v_flag & VMOUNT) != 0 || vp->v_mountedhere != NULL) { mtx_unlock(&vp->v_interlock); vfs_unbusy(mp, td); vput(vp); @@ -824,8 +809,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) return (error); } } - if ((error = vinvalbuf(vp, V_SAVE, td->td_ucred, td, 0, 0)) - != 0) { + if ((error = vinvalbuf(vp, V_SAVE, td->td_ucred, td, 0, 0)) != 0) { vput(vp); return (error); } @@ -837,7 +821,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) if (!strcmp(vfsp->vfc_name, fstype)) break; if (vfsp == NULL) { - /* Only load modules for root (very important!) */ + /* Only load modules for root (very important!). */ error = suser_td(td); if (error) { vput(vp); @@ -856,7 +840,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) return (error); } lf->userrefs++; - /* lookup again, see if the VFS was loaded */ + /* Look up again to see if the VFS was loaded. */ for (vfsp = vfsconf; vfsp; vfsp = vfsp->vfc_next) if (!strcmp(vfsp->vfc_name, fstype)) break; @@ -891,11 +875,9 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata) mp->mnt_stat.f_type = vfsp->vfc_typenum; mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK; strncpy(mp->mnt_stat.f_fstypename, fstype, MFSNAMELEN); - mp->mnt_stat.f_fstypename[MFSNAMELEN - 1] = '\0'; mp->mnt_vnodecovered = vp; mp->mnt_stat.f_owner = td->td_ucred->cr_uid; strncpy(mp->mnt_stat.f_mntonname, fspath, MNAMELEN); - mp->mnt_stat.f_mntonname[MNAMELEN - 1] = '\0'; mp->mnt_iosize_max = DFLTPHYS; VOP_UNLOCK(vp, 0, td); update: @@ -933,7 +915,7 @@ update: mp->mnt_kern_flag &=~ MNTK_WANTRDWR; if (error) { mp->mnt_flag = flag; - mp->mnt_kern_flag = flag2; + mp->mnt_kern_flag = kern_flag; } if ((mp->mnt_flag & MNT_RDONLY) == 0) { if (mp->mnt_syncer == NULL) |