diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/reply.c | 15 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 6 |
2 files changed, 16 insertions, 5 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 45c4b1d1df..c20daae21b 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -4236,10 +4236,11 @@ static BOOL rename_path_prefix_equal(const char *src, const char *dest) NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstring newname, uint32 attrs, BOOL replace_if_exists) { - SMB_STRUCT_STAT sbuf; + SMB_STRUCT_STAT sbuf, sbuf1; pstring newname_last_component; NTSTATUS status = NT_STATUS_OK; struct share_mode_lock *lck = NULL; + BOOL dst_exists; ZERO_STRUCT(sbuf); @@ -4307,12 +4308,22 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstrin return NT_STATUS_OK; } - if(!replace_if_exists && vfs_object_exist(conn, newname, NULL)) { + /* + * Have vfs_object_exist also fill sbuf1 + */ + dst_exists = vfs_object_exist(conn, newname, &sbuf1); + + if(!replace_if_exists && dst_exists) { DEBUG(3,("rename_internals_fsp: dest exists doing rename %s -> %s\n", fsp->fsp_name,newname)); return NT_STATUS_OBJECT_NAME_COLLISION; } + if (file_find_di_first(file_id_sbuf(&sbuf1)) != NULL) { + DEBUG(3, ("rename_internals_fsp: Target file open\n")); + return NT_STATUS_ACCESS_DENIED; + } + /* Ensure we have a valid stat struct for the source. */ if (fsp->fh->fd != -1) { if (SMB_VFS_FSTAT(fsp,fsp->fh->fd,&sbuf) == -1) { diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 429fdc154d..af6bc413d9 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -4611,7 +4611,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, pstring fname) { BOOL overwrite; - /* uint32 root_fid; */ /* Not used */ + uint32 root_fid; uint32 len; pstring newname; pstring base_name; @@ -4624,10 +4624,10 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, } overwrite = (CVAL(pdata,0) ? True : False); - /* root_fid = IVAL(pdata,4); */ + root_fid = IVAL(pdata,4); len = IVAL(pdata,8); - if (len > (total_data - 12) || (len == 0)) { + if (len > (total_data - 12) || (len == 0) || (root_fid != 0)) { return NT_STATUS_INVALID_PARAMETER; } |