| 965 | }; |
| 966 | #endif |
| 967 | int |
| 968 | sys_chroot(struct thread *td, struct chroot_args *uap) |
| 969 | { |
| 970 | struct nameidata nd; |
| 971 | int error; |
| 972 | |
| 973 | error = priv_check(td, PRIV_VFS_CHROOT); |
| 974 | if (error != 0) |
| 975 | return (error); |
| 976 | NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | AUDITVNODE1, |
| 977 | UIO_USERSPACE, uap->path, td); |
| 978 | error = namei(&nd); |
| 979 | if (error != 0) |
| 980 | goto error; |
| 981 | error = change_dir(nd.ni_vp, td); |
| 982 | if (error != 0) |
| 983 | goto e_vunlock; |
| 984 | #ifdef MAC |
| 985 | error = mac_vnode_check_chroot(td->td_ucred, nd.ni_vp); |
| 986 | if (error != 0) |
| 987 | goto e_vunlock; |
| 988 | #endif |
| 989 | VOP_UNLOCK(nd.ni_vp); |
| 990 | error = pwd_chroot(td, nd.ni_vp); |
| 991 | vrele(nd.ni_vp); |
| 992 | NDFREE_NOTHING(&nd); |
| 993 | return (error); |
| 994 | e_vunlock: |
| 995 | vput(nd.ni_vp); |
| 996 | error: |
| 997 | NDFREE_NOTHING(&nd); |
| 998 | return (error); |
| 999 | } |
| 1000 | |
| 1001 | /* |
| 1002 | * Common routine for chroot and chdir. Callers must provide a locked vnode |
nothing calls this directly
no test coverage detected