summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/access.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/syscall/access.c')
-rw-r--r--usr/src/uts/common/syscall/access.c51
1 files changed, 15 insertions, 36 deletions
diff --git a/usr/src/uts/common/syscall/access.c b/usr/src/uts/common/syscall/access.c
index 9e4f1aac84..a6bda94367 100644
--- a/usr/src/uts/common/syscall/access.c
+++ b/usr/src/uts/common/syscall/access.c
@@ -18,6 +18,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -68,7 +69,7 @@ caccess(char *fname, int fmode, vnode_t *startvp)
int estale_retry = 0;
if (fmode & ~(E_OK|R_OK|W_OK|X_OK))
- return (set_errno(EINVAL));
+ return (EINVAL);
mode = ((fmode & (R_OK|W_OK|X_OK)) << 6);
@@ -95,7 +96,7 @@ lookup:
goto lookup;
if (!eok)
crfree(tmpcr);
- return (set_errno(error));
+ return (error);
}
if (mode) {
@@ -106,7 +107,6 @@ lookup:
VN_RELE(vp);
goto lookup;
}
- (void) set_errno(error);
}
}
@@ -119,39 +119,17 @@ lookup:
int
faccessat(int fd, char *fname, int fmode, int flag)
{
- file_t *dirfp;
- vnode_t *dirvp;
+ vnode_t *startvp;
int error;
- char startchar;
-
- if (fd == AT_FDCWD && fname == NULL)
- return (set_errno(EFAULT));
if ((flag & ~AT_EACCESS) != 0)
return (set_errno(EINVAL));
- if (fname != NULL) {
- if (copyin(fname, &startchar, sizeof (char)))
- return (set_errno(EFAULT));
- } else
- startchar = '\0';
-
- if (fd == AT_FDCWD) {
- dirvp = NULL;
- } else {
- if (startchar != '/') {
- if ((dirfp = getf(fd)) == NULL) {
- return (set_errno(EBADF));
- }
- dirvp = dirfp->f_vnode;
- VN_HOLD(dirvp);
- releasef(fd);
- } else {
- dirvp = NULL;
- }
- }
-
- if (AU_AUDITING() && (dirvp != NULL))
+ if (fname == NULL)
+ return (set_errno(EFAULT));
+ if ((error = fgetstartvp(fd, fname, &startvp)) != 0)
+ return (set_errno(error));
+ if (AU_AUDITING() && startvp != NULL)
audit_setfsat_path(1);
/* Do not allow E_OK unless AT_EACCESS flag is set */
@@ -159,11 +137,12 @@ faccessat(int fd, char *fname, int fmode, int flag)
if (flag & AT_EACCESS)
fmode |= E_OK;
- error = caccess(fname, fmode, dirvp);
- if (dirvp != NULL)
- VN_RELE(dirvp);
-
- return (error);
+ error = caccess(fname, fmode, startvp);
+ if (startvp != NULL)
+ VN_RELE(startvp);
+ if (error)
+ return (set_errno(error));
+ return (0);
}
int