]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: libsmb: Fix SMB2 client rename bug to a Windows server.
authorJeremy Allison <jra@samba.org>
Tue, 30 Jun 2020 21:00:41 +0000 (14:00 -0700)
committerJeremy Allison <jra@samba.org>
Wed, 1 Jul 2020 18:59:53 +0000 (18:59 +0000)
Fix bug where renaming to a target name of one
UCS2 character (name length 2 bytes) fails to
a Windows 10 SMB2 server.

The Windows 10 SMB2 server has a minimum length
for a SMB2_FILE_RENAME_INFORMATION buffer of
24 bytes. It returns NT_STATUS_INFO_LENGTH_MISMATCH
if the length is less. This isn't an alignment
issue as Windows client happily 2-byte align
for larget target name sizes. Also the Windows 10
SMB1 server doesn't have this restriction.

If the name length is too short, pad out with
zeros to 24 bytes.

Hard to add a test for this as we don't want to
add this silly restriction to the Samba server
as it would break all non-Windows clients.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14403

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Wed Jul  1 18:59:53 UTC 2020 on sn-devel-184

source3/libsmb/cli_smb2_fnum.c

index e5d6e6b7fbda0e01cbfe019e4c781ee5608f0c26..8bf6629b9a1e75d27ee932c06756b454f74b13f6 100644 (file)
@@ -3124,6 +3124,7 @@ NTSTATUS cli_smb2_rename(struct cli_state *cli,
        smb_ucs2_t *converted_str = NULL;
        size_t converted_size_bytes = 0;
        size_t namelen = 0;
+       size_t inbuf_size;
        TALLOC_CTX *frame = talloc_stackframe();
 
        if (smbXcli_conn_has_async_calls(cli->conn)) {
@@ -3181,8 +3182,29 @@ NTSTATUS cli_smb2_rename(struct cli_state *cli,
        }
        converted_size_bytes -= 2;
 
-       inbuf = data_blob_talloc_zero(frame,
-                               20 + converted_size_bytes);
+       inbuf_size = 20 + converted_size_bytes;
+       if (inbuf_size < 20) {
+               /* Integer wrap check. */
+               status = NT_STATUS_INVALID_PARAMETER;
+               goto fail;
+       }
+
+       /*
+        * The Windows 10 SMB2 server has a minimum length
+        * for a SMB2_FILE_RENAME_INFORMATION buffer of
+        * 24 bytes. It returns NT_STATUS_INFO_LENGTH_MISMATCH
+        * if the length is less. This isn't an alignment
+        * issue as Windows client happily 2-byte align
+        * for larget target name sizes. Also the Windows 10
+        * SMB1 server doesn't have this restriction.
+        *
+        * BUG: https://bugzilla.samba.org/show_bug.cgi?id=14403
+        */
+       if (inbuf_size < 24) {
+               inbuf_size = 24;
+       }
+
+       inbuf = data_blob_talloc_zero(frame, inbuf_size);
        if (inbuf.data == NULL) {
                status = NT_STATUS_NO_MEMORY;
                goto fail;