]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ksmbd: limit read/write/trans buffer size not to exceed 8MB
authorNamjae Jeon <linkinjeon@kernel.org>
Fri, 15 Oct 2021 08:14:02 +0000 (17:14 +0900)
committerSteve French <stfrench@microsoft.com>
Fri, 15 Oct 2021 14:18:29 +0000 (09:18 -0500)
ksmbd limit read/write/trans buffer size not to exceed maximum 8MB.
And set the minimum value of max response buffer size to 64KB.
Windows client doesn't send session setup request if ksmbd set max
trans/read/write size lower than 64KB in smb2 negotiate.
It means windows allow at least 64 KB or more about this value.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/smb2ops.c
fs/ksmbd/smb2pdu.c
fs/ksmbd/smb2pdu.h

index b06456eb587b41f2e203cd67f666bc0f1c3afe83..fb6a65d231391b9204fb92772935fa592b0b321e 100644 (file)
@@ -284,6 +284,7 @@ int init_smb3_11_server(struct ksmbd_conn *conn)
 
 void init_smb2_max_read_size(unsigned int sz)
 {
+       sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
        smb21_server_values.max_read_size = sz;
        smb30_server_values.max_read_size = sz;
        smb302_server_values.max_read_size = sz;
@@ -292,6 +293,7 @@ void init_smb2_max_read_size(unsigned int sz)
 
 void init_smb2_max_write_size(unsigned int sz)
 {
+       sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
        smb21_server_values.max_write_size = sz;
        smb30_server_values.max_write_size = sz;
        smb302_server_values.max_write_size = sz;
@@ -300,6 +302,7 @@ void init_smb2_max_write_size(unsigned int sz)
 
 void init_smb2_max_trans_size(unsigned int sz)
 {
+       sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
        smb21_server_values.max_trans_size = sz;
        smb30_server_values.max_trans_size = sz;
        smb302_server_values.max_trans_size = sz;
index 89c187aa8db28235d00feae2b37ed3dfde127469..7999d8bc6892dc961235e57997b39201d0ee5ac7 100644 (file)
@@ -524,7 +524,7 @@ int smb2_allocate_rsp_buf(struct ksmbd_work *work)
 {
        struct smb2_hdr *hdr = work->request_buf;
        size_t small_sz = MAX_CIFS_SMALL_BUFFER_SIZE;
-       size_t large_sz = work->conn->vals->max_trans_size + MAX_SMB2_HDR_SIZE;
+       size_t large_sz = small_sz + work->conn->vals->max_trans_size;
        size_t sz = small_sz;
        int cmd = le16_to_cpu(hdr->Command);
 
index a6dec5ec6a5424c7075452c31dddf9d92aff7307..ff5a2f01d34ae561ba4d20a0cfaee476f0e8e9a1 100644 (file)
 #define SMB21_DEFAULT_IOSIZE   (1024 * 1024)
 #define SMB3_DEFAULT_IOSIZE    (4 * 1024 * 1024)
 #define SMB3_DEFAULT_TRANS_SIZE        (1024 * 1024)
+#define SMB3_MIN_IOSIZE        (64 * 1024)
+#define SMB3_MAX_IOSIZE        (8 * 1024 * 1024)
 
 /*
  * SMB2 Header Definition