lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 115/862] ksmbd: Fix wrong return value and message length check in smb2_ioctl()
    Date
    From: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>

    commit b1763d265af62800ec96eeb79803c4c537dcef3a upstream.

    Commit c7803b05f74b ("smb3: fix ksmbd bigendian bug in oplock
    break, and move its struct to smbfs_common") use the defination
    of 'struct validate_negotiate_info_req' in smbfs_common, the
    array length of 'Dialects' changed from 1 to 4, but the protocol
    does not require the client to send all 4. This lead the request
    which satisfied with protocol and server to fail.

    So just ensure the request payload has the 'DialectCount' in
    smb2_ioctl(), then fsctl_validate_negotiate_info() will use it
    to validate the payload length and each dialect.

    Also when the {in, out}_buf_len is less than the required, should
    goto out to initialize the status in the response header.

    Fixes: f7db8fd03a4b ("ksmbd: add validation in smb2_ioctl")
    Cc: stable@vger.kernel.org
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ksmbd/smb2pdu.c | 13 +++++++++----
    1 file changed, 9 insertions(+), 4 deletions(-)

    --- a/fs/ksmbd/smb2pdu.c
    +++ b/fs/ksmbd/smb2pdu.c
    @@ -7637,11 +7637,16 @@ int smb2_ioctl(struct ksmbd_work *work)
    goto out;
    }

    - if (in_buf_len < sizeof(struct validate_negotiate_info_req))
    - return -EINVAL;
    + if (in_buf_len < offsetof(struct validate_negotiate_info_req,
    + Dialects)) {
    + ret = -EINVAL;
    + goto out;
    + }

    - if (out_buf_len < sizeof(struct validate_negotiate_info_rsp))
    - return -EINVAL;
    + if (out_buf_len < sizeof(struct validate_negotiate_info_rsp)) {
    + ret = -EINVAL;
    + goto out;
    + }

    ret = fsctl_validate_negotiate_info(conn,
    (struct validate_negotiate_info_req *)&req->Buffer[0],

    \
     
     \ /
      Last update: 2022-10-19 11:00    [W:2.166 / U:1.820 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site