1
0
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:
Volker Lendecke 2007-08-19 19:57:55 +00:00 committed by Gerald (Jerry) Carter
parent 4a90264d17
commit fddc9db911
2 changed files with 29 additions and 15 deletions

View File

@ -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);

View File

@ -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 ));