From dda4a8b1f05f4fd843e4fde930c1edf926e31870 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 15 Nov 2011 11:27:56 -0800 Subject: [PATCH] Ensure we correctly calculate reply credits over all returned SMB2 replies, and do as Windows does and return the total in the last SMB2 reply. Fixes an issue found by Christian M Ambach (and thanks to Christian for the initial patch this was based on). (cherry picked from commit 65566dfa8629136eaf0dc1491502dc651d1a4858) Fix bug #8614 (SMB2: not granting credits for all requests in a compound request). (cherry picked from commit 35564365f49fda6505d6e350fa8b0e5ef1a4e33c) --- source3/smbd/smb2_server.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c index 0e70983263b..8a5d81f87b2 100644 --- a/source3/smbd/smb2_server.c +++ b/source3/smbd/smb2_server.c @@ -514,13 +514,24 @@ static void smb2_calculate_credits(const struct smbd_smb2_request *inreq, struct smbd_smb2_request *outreq) { int count, idx; + uint16_t total_credits = 0; count = outreq->out.vector_count; for (idx=1; idx < count; idx += 3) { + uint8_t *outhdr = (uint8_t *)outreq->out.vector[idx].iov_base; smb2_set_operation_credit(outreq->sconn, &inreq->in.vector[idx], &outreq->out.vector[idx]); + /* To match Windows, count up what we + just granted. */ + total_credits += SVAL(outhdr, SMB2_HDR_CREDIT); + /* Set to zero in all but the last reply. */ + if (idx + 3 < count) { + SSVAL(outhdr, SMB2_HDR_CREDIT, 0); + } else { + SSVAL(outhdr, SMB2_HDR_CREDIT, total_credits); + } } } @@ -1739,11 +1750,9 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req) smb2_setup_nbt_length(req->out.vector, req->out.vector_count); - /* Set credit for this operation (zero credits if this + /* Set credit for these operations (zero credits if this is a final reply for an async operation). */ - smb2_set_operation_credit(req->sconn, - &req->in.vector[i], - &req->out.vector[i]); + smb2_calculate_credits(req, req); if (req->do_signing) { NTSTATUS status; -- 2.11.4.GIT