summaryrefslogtreecommitdiff
path: root/libdiskfs/diskfs.h
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1995-12-14 20:51:17 +0000
committerMichael I. Bushnell <mib@gnu.org>1995-12-14 20:51:17 +0000
commitc12ff89783ecec965ea01abc7fb097abdec25d6d (patch)
treec750d718d6162583e017e9f4779b71c186733004 /libdiskfs/diskfs.h
parent7eed8cd21310c35405a775396eff798b3b2d74e0 (diff)
(diskfs_checkdirmod): Correctly return error code for failure, not 1.
Diffstat (limited to 'libdiskfs/diskfs.h')
-rw-r--r--libdiskfs/diskfs.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h
index 2b874178..3d5650aa 100644
--- a/libdiskfs/diskfs.h
+++ b/libdiskfs/diskfs.h
@@ -777,12 +777,20 @@ extern inline error_t
diskfs_checkdirmod (struct node *dp, struct node *np,
struct protid *cred)
{
+ error_t err;
+
/* The user must be able to write the directory, but if the directory
is sticky, then the user must also be either the owner of the directory
or the file. */
- return (diskfs_access (dp, S_IWRITE, cred)
- && (!(dp->dn_stat.st_mode & S_ISVTX) || !np || diskfs_isuid (0,cred)
- || diskfs_isowner (dp, cred) || diskfs_isowner (np, cred)));
+ err = diskfs_access (dp, S_IWRITE, cred);
+ if (err)
+ return err;
+
+ if ((dp->dn_stat.st_mode & S_ISVTX) && np && !diskfs_isuid (0, cred)
+ && !diskfs_isowner (dp, cred) && !diskfs_isowner (np, cred))
+ return EACCES;
+
+ return 0;
}
/* Reading and writing of files. this is called by other filesystem