mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
r24548: Fix the case-changing renames
This was broken when I changed reply_mv to wrap in a open_file_ntcreate call, unix_convert on the destination was called twice
This commit is contained in:
parent
4a90264d17
commit
fddc9db911
@ -5111,24 +5111,18 @@ static void notify_rename(connection_struct *conn, BOOL is_dir,
|
||||
Rename an open file - given an fsp.
|
||||
****************************************************************************/
|
||||
|
||||
NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp, pstring newname, uint32 attrs, BOOL replace_if_exists)
|
||||
NTSTATUS rename_internals_fsp(connection_struct *conn, files_struct *fsp,
|
||||
pstring newname,
|
||||
const char *newname_last_component,
|
||||
uint32 attrs, BOOL replace_if_exists)
|
||||
{
|
||||
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);
|
||||
|
||||
status = unix_convert(conn, newname, False, newname_last_component, &sbuf);
|
||||
|
||||
/* If an error we expect this to be NT_STATUS_OBJECT_PATH_NOT_FOUND */
|
||||
|
||||
if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(NT_STATUS_OBJECT_PATH_NOT_FOUND, status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = check_name(conn, newname);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return status;
|
||||
@ -5420,8 +5414,9 @@ NTSTATUS rename_internals(connection_struct *conn, struct smb_request *req,
|
||||
return status;
|
||||
}
|
||||
|
||||
status = rename_internals_fsp(conn, fsp, newname, attrs,
|
||||
replace_if_exists);
|
||||
status = rename_internals_fsp(conn, fsp, newname,
|
||||
last_component_dest,
|
||||
attrs, replace_if_exists);
|
||||
|
||||
close_file(fsp, NORMAL_CLOSE);
|
||||
|
||||
@ -5517,8 +5512,8 @@ NTSTATUS rename_internals(connection_struct *conn, struct smb_request *req,
|
||||
break;
|
||||
}
|
||||
|
||||
status = rename_internals_fsp(conn, fsp, destname, attrs,
|
||||
replace_if_exists);
|
||||
status = rename_internals_fsp(conn, fsp, destname, dname,
|
||||
attrs, replace_if_exists);
|
||||
|
||||
close_file(fsp, NORMAL_CLOSE);
|
||||
|
||||
|
@ -4937,9 +4937,28 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
|
||||
pstrcat(base_name, newname);
|
||||
|
||||
if (fsp) {
|
||||
SMB_STRUCT_STAT sbuf;
|
||||
pstring newname_last_component;
|
||||
|
||||
ZERO_STRUCT(sbuf);
|
||||
|
||||
status = unix_convert(conn, newname, False,
|
||||
newname_last_component, &sbuf);
|
||||
|
||||
/* If an error we expect this to be
|
||||
* NT_STATUS_OBJECT_PATH_NOT_FOUND */
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)
|
||||
&& !NT_STATUS_EQUAL(NT_STATUS_OBJECT_PATH_NOT_FOUND,
|
||||
status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
|
||||
fsp->fnum, fsp->fsp_name, base_name ));
|
||||
status = rename_internals_fsp(conn, fsp, base_name, 0, overwrite);
|
||||
status = rename_internals_fsp(conn, fsp, base_name,
|
||||
newname_last_component, 0,
|
||||
overwrite);
|
||||
} else {
|
||||
DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
|
||||
fname, newname ));
|
||||
|
Loading…
Reference in New Issue
Block a user