diff options
author | Jeremy Allison <jra@samba.org> | 2007-01-18 06:19:24 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2007-01-18 06:19:24 +0000 |
commit | 0413a26e1ff33da098059bd2c06855c5c423041b (patch) | |
tree | 089b62fc55e4f6d17ec5a7fb8137fd13e37a223e /source/smbd/nttrans.c | |
parent | e2b591f2fb42a5ac368df77372ebf895a0188f66 (diff) | |
download | samba-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.c | 23 |
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) { |