diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-06-14 14:45:37 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:23:22 -0500 |
commit | 9c4d185ef0740ea31da8718b9cb16dac7cddcc15 (patch) | |
tree | c90b8cf559d8254a39faff45ca4c8a98197f626a /source3/smbd | |
parent | bca15dbc68d5804f528ee2897396c5b1f42c9ae6 (diff) | |
download | samba-9c4d185ef0740ea31da8718b9cb16dac7cddcc15.tar.gz samba-9c4d185ef0740ea31da8718b9cb16dac7cddcc15.tar.bz2 samba-9c4d185ef0740ea31da8718b9cb16dac7cddcc15.zip |
r23500: Two changes to survive the now activated test for rename_internals_fsp:
With the target being open we have to return NT_STATUS_ACCESS_DENIED and
root_fid != 0 leads to NT_STATUS_INVALID_PARAMETER
(This used to be commit b599e5b1e10bdf825b2ce53de4a6ec35726d00f6)
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; } |