summaryrefslogtreecommitdiff
path: root/source3/smbd/dosmode.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/dosmode.c
parentfe0ce8dd8e18de6110404661f26db7a66ebac5ad (diff)
downloadsamba-bd16770954424d86298a57d6c59aa69d5b42ce07.tar.gz
samba-bd16770954424d86298a57d6c59aa69d5b42ce07.tar.bz2
samba-bd16770954424d86298a57d6c59aa69d5b42ce07.zip
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/dosmode.c')
-rw-r--r--source3/smbd/dosmode.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index 3a0e81e5fe..65ea2807e7 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -116,13 +116,18 @@ mode_t unix_mode(connection_struct *conn, int dosmode, const char *fname, BOOL c
Change a unix mode to a dos mode.
****************************************************************************/
-uint32 dos_mode_from_sbuf(connection_struct *conn, SMB_STRUCT_STAT *sbuf)
+uint32 dos_mode_from_sbuf(connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
{
int result = 0;
- if ((sbuf->st_mode & S_IWUSR) == 0)
+ if (lp_acl_check_permissions(SNUM(conn))) {
+ if (!can_write_to_file(conn, path, sbuf)) {
+ result |= aRONLY;
+ }
+ } else if ((sbuf->st_mode & S_IWUSR) == 0) {
result |= aRONLY;
-
+ }
+
if (MAP_ARCHIVE(conn) && ((sbuf->st_mode & S_IXUSR) != 0))
result |= aARCH;
@@ -291,7 +296,7 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf)
return result;
}
- result = dos_mode_from_sbuf(conn, sbuf);
+ result = dos_mode_from_sbuf(conn, path, sbuf);
/* Now do any modifications that depend on the path name. */
/* hide files with a name starting with a . */
@@ -433,9 +438,11 @@ int file_set_dosmode(connection_struct *conn, const char *fname, uint32 dosmode,
int file_utime(connection_struct *conn, const char *fname, struct utimbuf *times)
{
+ SMB_STRUCT_STAT sbuf;
int ret = -1;
errno = 0;
+ ZERO_STRUCT(sbuf);
if(SMB_VFS_UTIME(conn,fname, times) == 0)
return 0;
@@ -453,7 +460,7 @@ int file_utime(connection_struct *conn, const char *fname, struct utimbuf *times
*/
/* Check if we have write access. */
- if (can_write_to_file(conn, fname)) {
+ if (can_write_to_file(conn, fname, &sbuf)) {
/* We are allowed to become root and change the filetime. */
become_root();
ret = SMB_VFS_UTIME(conn,fname, times);