| 3560 | |
| 3561 | #ifdef MAC |
| 3562 | static int |
| 3563 | kern_renameat_mac(struct thread *td, int oldfd, const char *old, int newfd, |
| 3564 | const char *new, enum uio_seg pathseg, struct nameidata *fromnd) |
| 3565 | { |
| 3566 | int error; |
| 3567 | |
| 3568 | NDINIT_ATRIGHTS(fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | |
| 3569 | AUDITVNODE1, pathseg, old, oldfd, &cap_renameat_source_rights, td); |
| 3570 | if ((error = namei(fromnd)) != 0) |
| 3571 | return (error); |
| 3572 | error = mac_vnode_check_rename_from(td->td_ucred, fromnd->ni_dvp, |
| 3573 | fromnd->ni_vp, &fromnd->ni_cnd); |
| 3574 | VOP_UNLOCK(fromnd->ni_dvp); |
| 3575 | if (fromnd->ni_dvp != fromnd->ni_vp) |
| 3576 | VOP_UNLOCK(fromnd->ni_vp); |
| 3577 | if (error != 0) { |
| 3578 | NDFREE(fromnd, NDF_ONLY_PNBUF); |
| 3579 | vrele(fromnd->ni_dvp); |
| 3580 | vrele(fromnd->ni_vp); |
| 3581 | if (fromnd->ni_startdir) |
| 3582 | vrele(fromnd->ni_startdir); |
| 3583 | } |
| 3584 | return (error); |
| 3585 | } |
| 3586 | #endif |
| 3587 | |
| 3588 | int |
no test coverage detected