summaryrefslogtreecommitdiff
path: root/source/smbd/posix_acls.c
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-03-11 10:52:54 +0000
committerGerald Carter <jerry@samba.org>2005-03-11 10:52:54 +0000
commit061a07f6b476428c622618d83a5a1e54c5f05fe5 (patch)
tree5e926c06e720253210687391b68aa82f553c9ad3 /source/smbd/posix_acls.c
parent6c30768e14f5639328e06a73940f133f9078b90e (diff)
downloadsamba-061a07f6b476428c622618d83a5a1e54c5f05fe5.tar.gz
r5739: sync for 3.0.12rc1 (current with SAMBA_3_0 r5738)
Diffstat (limited to 'source/smbd/posix_acls.c')
-rw-r--r--source/smbd/posix_acls.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/source/smbd/posix_acls.c b/source/smbd/posix_acls.c
index d02edc5ea06..c5f96db85c1 100644
--- a/source/smbd/posix_acls.c
+++ b/source/smbd/posix_acls.c
@@ -3903,10 +3903,26 @@ BOOL can_delete_file_in_directory(connection_struct *conn, const char *fname)
if (current_user.uid == sbuf.st_uid) {
return (sbuf.st_mode & S_IWUSR) ? True : False;
}
+
+#ifdef S_ISVTX
+ /* sticky bit means delete only by owner or root. */
+ if (sbuf.st_mode & S_ISVTX) {
+ SMB_STRUCT_STAT sbuf_file;
+ if(SMB_VFS_STAT(conn, fname, &sbuf_file) != 0) {
+ return False;
+ }
+ if (current_user.uid == sbuf_file.st_uid) {
+ return True;
+ }
+ return False;
+ }
+#endif
+
/* Check group ownership. */
ret = check_posix_acl_group_write(conn, dname, &sbuf);
if (ret == 0 || ret == 1) {
return ret ? True : False;
}
+
return (sbuf.st_mode & S_IWOTH) ? True : False;
}