]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: smbd: Tweak the logic of smb2_file_rename_information().
authorJeremy Allison <jra@samba.org>
Fri, 29 Jul 2022 21:38:17 +0000 (14:38 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 2 Aug 2022 19:49:32 +0000 (19:49 +0000)
There's no point in calling filename_convert() and then
just ignoring the returned smb_fname if it's a raw stream name.
Only call filename_convert() if we know it isn't a raw stream
name.

Ignore stream/non-stream mismatches in src and dst in
smb2_file_rename_information, let rename_internals_fsp()
take care of that as the error returns inside rename_internals_fsp()
are tested by raw.streams.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
source3/smbd/smb2_trans2.c

index 512df98f100e2633ab97305c4019e898640d9fd5..c1b1626f9f8841042d99093a0fc7a899de26b553 100644 (file)
@@ -4983,22 +4983,7 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn,
        DEBUG(10,("smb2_file_rename_information: got name |%s|\n",
                                newname));
 
-       status = filename_convert(ctx,
-                               conn,
-                               newname,
-                               ucf_flags,
-                               0,
-                               &smb_fname_dst);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       if (fsp->base_fsp) {
-               /* newname must be a stream name. */
-               if (newname[0] != ':') {
-                       return NT_STATUS_NOT_SUPPORTED;
-               }
-
+       if (newname[0] == ':') {
                /* Create an smb_fname to call rename_internals_fsp() with. */
                smb_fname_dst = synthetic_smb_fname(talloc_tos(),
                                        fsp->base_fsp->fsp_name->base_name,
@@ -5010,6 +4995,16 @@ static NTSTATUS smb2_file_rename_information(connection_struct *conn,
                        status = NT_STATUS_NO_MEMORY;
                        goto out;
                }
+       } else {
+               status = filename_convert(ctx,
+                                       conn,
+                                       newname,
+                                       ucf_flags,
+                                       0,
+                                       &smb_fname_dst);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto out;
+               }
        }
 
        /*