The branch, v3-6-test has been updated via 318c77e Fix bug 8133 - strange behavior for the file (whose filename first character is period ) in SMB2 case. via e66e505 Optimization. If the attributes passed to can_rename() include both FILE_ATTRIBUTE_HIDDEN and FILE_ATTRIBUTE_SYSTEM then there's no point in reading the source DOS attribute, as we're not going to deny the rename on attribute match. from 9231770 Make protocol version 2 the default protocol, and only run on version 1 if V1 is explcitly given as a module option.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test - Log ----------------------------------------------------------------- commit 318c77ec46c3769d462bada130956d0081c48be2 Author: Jeremy Allison <j...@samba.org> Date: Thu May 19 16:39:18 2011 -0700 Fix bug 8133 - strange behavior for the file (whose filename first character is period ) in SMB2 case. When doing SMB2 renames, we need to match all filetypes (no attributes field in the SMB2 call). By default a file starting with a period is returned as FILE_ATTRIBUTE_HIDDEN in Samba. Autobuild-User: Jeremy Allison <j...@samba.org> Autobuild-Date: Fri May 20 19:26:04 CEST 2011 on sn-devel-104 commit e66e505db8e3e6c7938eb09dc55e080f7754ddd1 Author: Jeremy Allison <j...@samba.org> Date: Thu May 19 16:38:11 2011 -0700 Optimization. If the attributes passed to can_rename() include both FILE_ATTRIBUTE_HIDDEN and FILE_ATTRIBUTE_SYSTEM then there's no point in reading the source DOS attribute, as we're not going to deny the rename on attribute match. ----------------------------------------------------------------------- Summary of changes: source3/smbd/reply.c | 13 ++++++++----- source3/smbd/trans2.c | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 9c66dde..099a36e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2381,15 +2381,18 @@ void reply_ctemp(struct smb_request *req) static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp, uint16 dirtype) { - uint32 fmode; - if (!CAN_WRITE(conn)) { return NT_STATUS_MEDIA_WRITE_PROTECTED; } - fmode = dos_mode(conn, fsp->fsp_name); - if ((fmode & ~dirtype) & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { - return NT_STATUS_NO_SUCH_FILE; + if ((dirtype & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) != + (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { + /* Only bother to read the DOS attribute if we might deny the + rename on the grounds of attribute missmatch. */ + uint32_t fmode = dos_mode(conn, fsp->fsp_name); + if ((fmode & ~dirtype) & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { + return NT_STATUS_NO_SUCH_FILE; + } } if (S_ISDIR(fsp->fsp_name->st.st_ex_mode)) { diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 42b915b..be3d5a6 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -6051,8 +6051,9 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn, "SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n", fsp->fnum, fsp_str_dbg(fsp), smb_fname_str_dbg(smb_fname_dst))); - status = rename_internals_fsp(conn, fsp, smb_fname_dst, 0, - overwrite); + status = rename_internals_fsp(conn, fsp, smb_fname_dst, + (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM), + overwrite); out: TALLOC_FREE(smb_fname_dst); -- Samba Shared Repository