summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-08-19 19:57:55 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:29:56 -0500
commit2efabbbf4b97a62247aa080249d3de21f044b1cb (patch)
treeb764c27ff639bf671f076fcca5eac2226f758b8a
parent06dd8d28ae1625e201082f0dc7019f753c9afb34 (diff)
downloadsamba-2efabbbf4b97a62247aa080249d3de21f044b1cb.tar.gz
samba-2efabbbf4b97a62247aa080249d3de21f044b1cb.tar.bz2
samba-2efabbbf4b97a62247aa080249d3de21f044b1cb.zip
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 used to be commit fddc9db91175bdb0b7ac6a636f8bef918bd7c1b4)
-rw-r--r--source3/smbd/reply.c23
-rw-r--r--source3/smbd/trans2.c21
2 files changed, 29 insertions, 15 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index ce3eebff99..b3c4717b0b 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -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);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 36fb2eee76..53368cd8ef 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -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 ));