From: Pavel Shilovsky <piastryyy@xxxxxxxxx> Signed-off-by: Pavel Shilovsky <piastryyy@xxxxxxxxx> --- fs/cifs/connect.c | 19 +++++++++++++++++-- fs/cifs/nterr.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index f8d5023..0e188b9 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -827,10 +827,10 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) * into the payload for debugging purposes. */ #ifdef CONFIG_CIFS_SMB2 - if (server->is_smb2) + if (server->is_smb2) { length = checkSMB2(smb2_buffer, smb2_buffer->MessageId, server->total_read); - else + } else #endif length = checkSMB(smb_buffer, smb_buffer->Mid, server->total_read); @@ -838,6 +838,21 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) cifs_dump_mem("Bad SMB: ", buf, min_t(unsigned int, server->total_read, 48)); +#ifdef CONFIG_CIFS_SMB2 + /* + * If we negotiate SMB2 protocol and get STATUS_PENDING - update + * the number of credits and skip it. + */ + if (server->is_smb2 && + le32_to_cpu(smb2_buffer->Status) == STATUS_PENDING) { + if (!length) + atomic_add(le16_to_cpu(smb2_buffer->CreditRequest), + &server->credits); + cERROR(1, "STATUS PENDING"); + return -1; + } +#endif + if (mid) handle_mid(mid, server, buf, length); diff --git a/fs/cifs/nterr.h b/fs/cifs/nterr.h index 2572673..e80c0ef 100644 --- a/fs/cifs/nterr.h +++ b/fs/cifs/nterr.h @@ -40,6 +40,7 @@ extern const struct nt_err_code_struct nt_errs[]; #define ERROR_INSUFFICIENT_BUFFER 0x007a #define STATUS_1804 0x070c #define STATUS_NOTIFY_ENUM_DIR 0x010c +#define STATUS_PENDING 0x00000103 /* Win32 Error codes extracted using a loop in smbclient then printing a netmon sniff to a file. */ -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html