diff options
author | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-07-07 17:36:17 -0700 |
---|---|---|
committer | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-07-07 17:36:17 -0700 |
commit | 794f0adb050e571bbfde4d2a19b9f88b852079dd (patch) | |
tree | c1735b3eda175e9096f5b062a73614e73aa5cd9a /usr/src/uts/common/syscall/rename.c | |
parent | 07925104db56e5c3eacc4865b918bd16af5cec59 (diff) | |
download | illumos-joyent-794f0adb050e571bbfde4d2a19b9f88b852079dd.tar.gz |
PSARC 2010/235 POSIX 1003.1-2008 *at(2) syscalls
6910251 need support for all POSIX.1-2008 *at(2) syscalls
6964835 mknod(2) auditing omits the pathname for invalid arguments
Diffstat (limited to 'usr/src/uts/common/syscall/rename.c')
-rw-r--r-- | usr/src/uts/common/syscall/rename.c | 69 |
1 files changed, 17 insertions, 52 deletions
diff --git a/usr/src/uts/common/syscall/rename.c b/usr/src/uts/common/syscall/rename.c index 59344790c9..c6e4f08082 100644 --- a/usr/src/uts/common/syscall/rename.c +++ b/usr/src/uts/common/syscall/rename.c @@ -42,74 +42,39 @@ #include <sys/debug.h> #include <sys/file.h> #include <sys/fcntl.h> +#include <c2/audit.h> /* * Rename a file relative to a given directory */ int -renameat(int fromfd, char *old, int tofd, char *new) +renameat(int ffd, char *from, int tfd, char *to) { - vnode_t *fromvp = NULL; - vnode_t *tovp = NULL; - file_t *fp; + vnode_t *fstartvp = NULL; + vnode_t *tstartvp = NULL; int error; - char oldstart; - char newstart; - if (copyin(old, &oldstart, sizeof (char)) || - copyin(new, &newstart, sizeof (char))) + if (from == NULL || to == NULL) return (set_errno(EFAULT)); + if ((error = fgetstartvp(ffd, from, &fstartvp)) != 0) + goto out; + if ((error = fgetstartvp(tfd, to, &tstartvp)) != 0) + goto out; - if (fromfd == AT_FDCWD || tofd == AT_FDCWD) { - proc_t *p = curproc; + error = vn_renameat(fstartvp, from, tstartvp, to, UIO_USERSPACE); - mutex_enter(&p->p_lock); - if (fromfd == AT_FDCWD) { - fromvp = PTOU(p)->u_cdir; - VN_HOLD(fromvp); - } - if (tofd == AT_FDCWD) { - tovp = PTOU(p)->u_cdir; - VN_HOLD(tovp); - } - mutex_exit(&p->p_lock); - } - - if (fromvp == NULL && oldstart != '/') { - if ((fp = getf(fromfd)) == NULL) { - if (tovp != NULL) - VN_RELE(tovp); - return (set_errno(EBADF)); - } - fromvp = fp->f_vnode; - VN_HOLD(fromvp); - releasef(fromfd); - } - - if (tovp == NULL && newstart != '/') { - if ((fp = getf(tofd)) == NULL) { - if (fromvp != NULL) - VN_RELE(fromvp); - return (set_errno(EBADF)); - } - tovp = fp->f_vnode; - VN_HOLD(tovp); - releasef(tofd); - } - - error = vn_renameat(fromvp, old, tovp, new, UIO_USERSPACE); - - if (fromvp != NULL) - VN_RELE(fromvp); - if (tovp != NULL) - VN_RELE(tovp); +out: + if (fstartvp != NULL) + VN_RELE(fstartvp); + if (tstartvp != NULL) + VN_RELE(tstartvp); if (error) return (set_errno(error)); return (0); } int -rename(char *old, char *new) +rename(char *from, char *to) { - return (renameat(AT_FDCWD, old, AT_FDCWD, new)); + return (renameat(AT_FDCWD, from, AT_FDCWD, to)); } |