When we have decrypted a compounded smb3 packet we need to fake total_read to match the individual pdu's in that compound. Otherwise, if we leave total_read to be the size of the full smb3 transform pdu this will trigger smb2_check_message to flag a length warning. Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx> --- fs/cifs/smb2misc.c | 2 +- fs/cifs/smb2ops.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c index db0453660ff6..1fec74d27525 100644 --- a/fs/cifs/smb2misc.c +++ b/fs/cifs/smb2misc.c @@ -241,7 +241,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr) * Some windows servers (win2016) will pad also the final * PDU in a compound to 8 bytes. */ - if (((clc_len + 7) & ~7) == len) + if (roundup(clc_len, 8) == len) return 0; /* diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index cf3ad04e5bb1..8821990fd521 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -3104,7 +3104,12 @@ receive_encrypted_standard(struct TCP_Server_Info *server, memcpy(next_buffer, tmpbuf + le32_to_cpu(shdr->NextCommand), pdu_length - le32_to_cpu(shdr->NextCommand)); - } + + server->total_read = + le32_to_cpu(shdr->NextCommand); + } else + server->total_read = + pdu_length - sizeof(struct smb2_transform_hdr); mid_entry = smb2_find_mid(server, buf); if (mid_entry == NULL) -- 2.13.3