summaryrefslogtreecommitdiffstats
path: root/source/smbd/nttrans.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-01-18 06:19:24 +0000
committerJeremy Allison <jra@samba.org>2007-01-18 06:19:24 +0000
commit0413a26e1ff33da098059bd2c06855c5c423041b (patch)
tree089b62fc55e4f6d17ec5a7fb8137fd13e37a223e /source/smbd/nttrans.c
parente2b591f2fb42a5ac368df77372ebf895a0188f66 (diff)
downloadsamba-0413a26e1ff33da098059bd2c06855c5c423041b.tar.gz
samba-0413a26e1ff33da098059bd2c06855c5c423041b.tar.xz
samba-0413a26e1ff33da098059bd2c06855c5c423041b.zip
r20873: Some correctness fixes w.r.t. Samba4 torture BASE-DELETE.
Allow us to correctly refuse to set delete on close on a non-empty directory. There are still some delete-on-close wrinkles to be fixed, but I understand how to do that better now. I'll fix this tomorrow. Jeremy.
Diffstat (limited to 'source/smbd/nttrans.c')
-rw-r--r--source/smbd/nttrans.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c
index cfd0c0d9408..b9bec5eb18a 100644
--- a/source/smbd/nttrans.c
+++ b/source/smbd/nttrans.c
@@ -652,11 +652,13 @@ int reply_ntcreate_and_X(connection_struct *conn,
if (lp_acl_check_permissions(SNUM(conn))
&& (create_disposition != FILE_CREATE)
&& (share_access & FILE_SHARE_DELETE)
- && (access_mask & DELETE_ACCESS)
- && !can_delete_file_in_directory(conn, fname)) {
- restore_case_semantics(conn, file_attributes);
- END_PROFILE(SMBntcreateX);
- return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+ && (access_mask & DELETE_ACCESS)) {
+ if ((dos_mode(conn, fname, &sbuf) & FILE_ATTRIBUTE_READONLY) ||
+ !can_delete_file_in_directory(conn, fname)) {
+ restore_case_semantics(conn, file_attributes);
+ END_PROFILE(SMBntcreateX);
+ return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+ }
}
/*
@@ -1277,10 +1279,13 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
if (lp_acl_check_permissions(SNUM(conn))
&& (create_disposition != FILE_CREATE)
&& (share_access & FILE_SHARE_DELETE)
- && (access_mask & DELETE_ACCESS)
- && !can_delete_file_in_directory(conn, fname)) {
- restore_case_semantics(conn, file_attributes);
- return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+ && (access_mask & DELETE_ACCESS)) {
+ if ((dos_mode(conn, fname, &sbuf) & FILE_ATTRIBUTE_READONLY) ||
+ !can_delete_file_in_directory(conn, fname)) {
+ restore_case_semantics(conn, file_attributes);
+ END_PROFILE(SMBntcreateX);
+ return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+ }
}
if (ea_len) {