diff options
author | Jeremy Allison <jra@samba.org> | 2011-05-19 16:38:11 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2011-05-20 09:18:13 -0700 |
commit | 38c77db9892b5d607a7a05fab563f5f6977794e1 (patch) | |
tree | fcaeb5fbb02ad8a61fe6e1e778d3fabe83a581f8 /source3 | |
parent | df650fa8cf4954245eced7eccb26388c24acee82 (diff) | |
download | samba-38c77db9892b5d607a7a05fab563f5f6977794e1.tar.gz samba-38c77db9892b5d607a7a05fab563f5f6977794e1.tar.bz2 samba-38c77db9892b5d607a7a05fab563f5f6977794e1.zip |
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.
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/reply.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 99ab4ca34b..31f596c250 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)) { |