summaryrefslogtreecommitdiff
path: root/source3/smbd/posix_acls.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2005-05-18 23:37:35 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:56:56 -0500
commitbd16770954424d86298a57d6c59aa69d5b42ce07 (patch)
tree01dcf664e7d76d365c525e512e783c6e1384634b /source3/smbd/posix_acls.c
parentfe0ce8dd8e18de6110404661f26db7a66ebac5ad (diff)
downloadsamba-bd16770954424d86298a57d6c59aa69d5b42ce07.tar.gz
r6895: Add "acl check permissions" to turn on/off the new behaviour of
checking for write access in a directory before delete. Also controls checking for write access before labeling a file read-only if DOS attributes are not being stored in EA's. Docuementation to follow. Jeremy. (This used to be commit dd1a5e6e499dd721c5bb8d56a61810a7454a3449)
Diffstat (limited to 'source3/smbd/posix_acls.c')
-rw-r--r--source3/smbd/posix_acls.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c
index b31e97c76f8..b5052eec256 100644
--- a/source3/smbd/posix_acls.c
+++ b/source3/smbd/posix_acls.c
@@ -4006,9 +4006,8 @@ BOOL can_delete_file_in_directory(connection_struct *conn, const char *fname)
this to successfully check for ability to write for dos filetimes.
****************************************************************************/
-BOOL can_write_to_file(connection_struct *conn, const char *fname)
+BOOL can_write_to_file(connection_struct *conn, const char *fname, SMB_STRUCT_STAT *psbuf)
{
- SMB_STRUCT_STAT sbuf;
int ret;
if (!CAN_WRITE(conn)) {
@@ -4020,22 +4019,24 @@ BOOL can_write_to_file(connection_struct *conn, const char *fname)
return True;
}
- /* Get the file permission mask and owners. */
- if(SMB_VFS_STAT(conn, fname, &sbuf) != 0) {
- return False;
+ if (!VALID_STAT(*psbuf)) {
+ /* Get the file permission mask and owners. */
+ if(SMB_VFS_STAT(conn, fname, psbuf) != 0) {
+ return False;
+ }
}
/* Check primary owner write access. */
- if (current_user.uid == sbuf.st_uid) {
- return (sbuf.st_mode & S_IWUSR) ? True : False;
+ if (current_user.uid == psbuf->st_uid) {
+ return (psbuf->st_mode & S_IWUSR) ? True : False;
}
/* Check group or explicit user acl entry write access. */
- ret = check_posix_acl_group_write(conn, fname, &sbuf);
+ ret = check_posix_acl_group_write(conn, fname, psbuf);
if (ret == 0 || ret == 1) {
return ret ? True : False;
}
/* Finally check other write access. */
- return (sbuf.st_mode & S_IWOTH) ? True : False;
+ return (psbuf->st_mode & S_IWOTH) ? True : False;
}