summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/rename.c
diff options
context:
space:
mode:
authorRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-07-07 17:36:17 -0700
committerRoger A. Faulkner <Roger.Faulkner@Oracle.COM>2010-07-07 17:36:17 -0700
commit794f0adb050e571bbfde4d2a19b9f88b852079dd (patch)
treec1735b3eda175e9096f5b062a73614e73aa5cd9a /usr/src/uts/common/syscall/rename.c
parent07925104db56e5c3eacc4865b918bd16af5cec59 (diff)
downloadillumos-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.c69
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));
}