r24548: Fix the case-changing renames
authorVolker Lendecke <vlendec@samba.org>
Sun, 19 Aug 2007 19:57:55 +0000 (19:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:29:56 +0000 (12:29 -0500)
This was broken when I changed reply_mv to wrap in a open_file_ntcreate
call, unix_convert on the destination was called twice

source/smbd/reply.c
source/smbd/trans2.c

index ce3eebff9905f8ef5431e4288174c38cd7ae1727..b3c4717b0b6d41f1c9cd246cfcd22b70fc172fce 100644 (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);
 
index 36fb2eee76ee1e6c3647b76d8675ae4927a82a20..53368cd8efb62e2175e1cdffc632c6d09d24431f 100644 (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 ));