diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/dosmode.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index cd7a1fdca1..1fb00886f7 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -705,6 +705,7 @@ int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname, int ret = -1, lret = -1; uint32_t old_mode; struct timespec new_create_timespec; + files_struct *fsp = NULL; if (!CAN_WRITE(conn)) { errno = EROFS; @@ -855,29 +856,25 @@ int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname, bits on a file. Just like file_ntimes below. */ - /* Check if we have write access. */ - if (CAN_WRITE(conn)) { - /* - * We need to open the file with write access whilst - * still in our current user context. This ensures we - * are not violating security in doing the fchmod. - */ - files_struct *fsp; - if (!NT_STATUS_IS_OK(open_file_fchmod(conn, smb_fname, - &fsp))) - return -1; - become_root(); - ret = SMB_VFS_FCHMOD(fsp, unixmode); - unbecome_root(); - close_file(NULL, fsp, NORMAL_CLOSE); - if (!newfile) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES, - smb_fname->base_name); - } - if (ret == 0) { - smb_fname->st.st_ex_mode = unixmode; - } + /* + * We need to open the file with write access whilst + * still in our current user context. This ensures we + * are not violating security in doing the fchmod. + */ + if (!NT_STATUS_IS_OK(open_file_fchmod(conn, smb_fname, + &fsp))) + return -1; + become_root(); + ret = SMB_VFS_FCHMOD(fsp, unixmode); + unbecome_root(); + close_file(NULL, fsp, NORMAL_CLOSE); + if (!newfile) { + notify_fname(conn, NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, + smb_fname->base_name); + } + if (ret == 0) { + smb_fname->st.st_ex_mode = unixmode; } return( ret ); |