The branch, master has been updated
       via  5f23776 s3:smb2cli: pass timeout to smb2cli_req_create/send()
       via  271f78a s3:smb2cli: pass an array of expected status/body_size 
pairs to smb2cli_req_recv()
       via  b6b767a s3:smb2cli: only use tevent_req_defer_callback() if we have 
more than one smb2 response
       via  46f64aa s3:smb2cli: ignore async interim responses and store the 
async_id
       via  eb46c7b s3:smb2cli: check the response has the 
SMB2_HDR_FLAG_REDIRECT flag
       via  8209157 s3:smb2cli: validate the opcode from the server is as 
expected
       via  270e88f s3:smb2cli: initialize status if we got an unexpected 
response
       via  2bb17dc s3:libsmb: return INTERNAL_ERROR if the request is in bad 
state when the caller ships it
       via  bbe78ca s3:libsmb: return if tevent_req_set_endtime() fails
       via  79043f8 s3:SMB2-BASIC: test smb2cli_flush()
       via  a0dcbf8 s3:smb2cli: SMB2_FLUSH responses have a body size of 4
      from  80d643f s3: Trim a debug to 80 chars

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5f237763f89ce13240a6e47dddc4dff60e26fa7f
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 19:56:50 2011 +0200

    s3:smb2cli: pass timeout to smb2cli_req_create/send()
    
    metze
    
    Autobuild-User: Stefan Metzmacher <[email protected]>
    Autobuild-Date: Sun Sep 18 07:04:05 CEST 2011 on sn-devel-104

commit 271f78a9bb814ed10bcc8883a60d6609e1eef500
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Aug 31 00:40:06 2011 +0200

    s3:smb2cli: pass an array of expected status/body_size pairs to 
smb2cli_req_recv()
    
    This gives the caller more control and correctly reports unexpected
    errors to the caller, instead of return NT_STATUS_INVALID_NETWOR_RESPONSE
    
    metze

commit b6b767a2c47b26c1758520212b4f09ddb934c9f3
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Sep 7 18:55:02 2011 +0200

    s3:smb2cli: only use tevent_req_defer_callback() if we have more than one 
smb2 response
    
    metze

commit 46f64aafcbb66adfe42d7f4b26709878acfd3648
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 21:17:18 2011 +0200

    s3:smb2cli: ignore async interim responses and store the async_id
    
    metze

commit eb46c7bff380b77b9f59c32a4918ad5b6c326dce
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 21:15:45 2011 +0200

    s3:smb2cli: check the response has the SMB2_HDR_FLAG_REDIRECT flag
    
    metze

commit 820915775886a7cfbac1f0c65cbf151d01d82146
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 21:13:58 2011 +0200

    s3:smb2cli: validate the opcode from the server is as expected
    
    metze

commit 270e88f4ff72ce1bd8dcd5e653df43d516951837
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 21:11:23 2011 +0200

    s3:smb2cli: initialize status if we got an unexpected response
    
    metze

commit 2bb17dc23ebbd0b89d39d6d827ed073b8bf2c65d
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 21:09:30 2011 +0200

    s3:libsmb: return INTERNAL_ERROR if the request is in bad state when the 
caller ships it
    
    metze

commit bbe78ca5a217eeba69a1e9189d8922c637d124f7
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 19:49:01 2011 +0200

    s3:libsmb: return if tevent_req_set_endtime() fails
    
    tevent_req_set_endtime() already calls tevent_req_nomem().
    
    metze

commit 79043f84d1916196fc163d4cacd10235301a3283
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 19:29:51 2011 +0200

    s3:SMB2-BASIC: test smb2cli_flush()
    
    metze

commit a0dcbf8d628ac19861648f914f576c1addce7b79
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Sep 17 19:30:36 2011 +0200

    s3:smb2cli: SMB2_FLUSH responses have a body size of 4
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source3/libsmb/async_smb.c               |   14 +++-
 source3/libsmb/smb2cli_base.c            |  114 +++++++++++++++++++++++++++--
 source3/libsmb/smb2cli_base.h            |   12 +++-
 source3/libsmb/smb2cli_close.c           |   10 +++-
 source3/libsmb/smb2cli_create.c          |   10 +++-
 source3/libsmb/smb2cli_flush.c           |   10 +++-
 source3/libsmb/smb2cli_negprot.c         |   10 +++-
 source3/libsmb/smb2cli_query_directory.c |   10 +++-
 source3/libsmb/smb2cli_read.c            |   14 ++++-
 source3/libsmb/smb2cli_session.c         |   26 ++++++-
 source3/libsmb/smb2cli_tcon.c            |   20 +++++-
 source3/libsmb/smb2cli_write.c           |   10 +++-
 source3/torture/test_smb2.c              |    6 ++
 13 files changed, 243 insertions(+), 23 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index 8966794..efeb328 100644
--- a/source3/libsmb/async_smb.c
+++ b/source3/libsmb/async_smb.c
@@ -420,7 +420,7 @@ struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
        if (cli->timeout) {
                endtime = timeval_current_ofs_msec(cli->timeout);
                if (!tevent_req_set_endtime(result, ev, endtime)) {
-                       tevent_req_oom(result);
+                       return result;
                }
        }
 
@@ -539,6 +539,10 @@ NTSTATUS cli_smb_req_send(struct tevent_req *req)
        struct cli_smb_state *state = tevent_req_data(
                req, struct cli_smb_state);
 
+       if (!tevent_req_is_in_progress(req)) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
        return cli_smb_req_iov_send(req, state, state->iov, state->iov_count);
 }
 
@@ -563,7 +567,9 @@ struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx,
        if (req == NULL) {
                return NULL;
        }
-
+       if (!tevent_req_is_in_progress(req)) {
+               return tevent_req_post(req, ev);
+       }
        status = cli_smb_req_send(req);
        if (!NT_STATUS_IS_OK(status)) {
                tevent_req_nterror(req, status);
@@ -991,6 +997,10 @@ NTSTATUS cli_smb_chain_send(struct tevent_req **reqs, int 
num_reqs)
 
        iovlen = 0;
        for (i=0; i<num_reqs; i++) {
+               if (!tevent_req_is_in_progress(reqs[i])) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
+
                state = tevent_req_data(reqs[i], struct cli_smb_state);
                iovlen += state->iov_count;
        }
diff --git a/source3/libsmb/smb2cli_base.c b/source3/libsmb/smb2cli_base.c
index 5089aa9..f8b2f6e 100644
--- a/source3/libsmb/smb2cli_base.c
+++ b/source3/libsmb/smb2cli_base.c
@@ -178,6 +178,7 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
                                      uint16_t cmd,
                                      uint32_t additional_flags,
                                      uint32_t clear_flags,
+                                     unsigned int timeout,
                                      uint32_t pid,
                                      uint32_t tid,
                                      uint64_t uid,
@@ -223,6 +224,15 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
        SIVAL(state->hdr, SMB2_HDR_TID,         tid);
        SBVAL(state->hdr, SMB2_HDR_SESSION_ID,  uid);
 
+       if (timeout > 0) {
+               struct timeval endtime;
+
+               endtime = timeval_current_ofs_msec(timeout);
+               if (!tevent_req_set_endtime(req, ev, endtime)) {
+                       return req;
+               }
+       }
+
        return req;
 }
 
@@ -333,6 +343,7 @@ struct tevent_req *smb2cli_req_send(TALLOC_CTX *mem_ctx,
                                    uint16_t cmd,
                                    uint32_t additional_flags,
                                    uint32_t clear_flags,
+                                   unsigned int timeout,
                                    uint32_t pid,
                                    uint32_t tid,
                                    uint64_t uid,
@@ -346,6 +357,7 @@ struct tevent_req *smb2cli_req_send(TALLOC_CTX *mem_ctx,
 
        req = smb2cli_req_create(mem_ctx, ev, cli, cmd,
                                 additional_flags, clear_flags,
+                                timeout,
                                 pid, tid, uid,
                                 fixed, fixed_len, dyn, dyn_len);
        if (req == NULL) {
@@ -515,6 +527,7 @@ static void smb2cli_inbuf_received(struct tevent_req 
*subreq)
        ssize_t received;
        int err;
        size_t num_pending;
+       bool defer = true;
 
        received = read_smb_recv(subreq, frame, &inbuf, &err);
        TALLOC_FREE(subreq);
@@ -547,9 +560,12 @@ static void smb2cli_inbuf_received(struct tevent_req 
*subreq)
                uint8_t *inbuf_ref = NULL;
                struct iovec *cur = &iov[i];
                uint8_t *inhdr = (uint8_t *)cur[0].iov_base;
+               uint16_t opcode = SVAL(inhdr, SMB2_HDR_OPCODE);
+               uint32_t flags = IVAL(inhdr, SMB2_HDR_FLAGS);
+               uint64_t mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
+               uint16_t req_opcode;
 
-               req = cli_smb2_find_pending(
-                       cli, BVAL(inhdr, SMB2_HDR_MESSAGE_ID));
+               req = cli_smb2_find_pending(cli, mid);
                if (req == NULL) {
                        /*
                         * TODO: handle oplock breaks and async responses
@@ -559,18 +575,53 @@ static void smb2cli_inbuf_received(struct tevent_req 
*subreq)
                         * We need to close the connection and notify
                         * all pending requests.
                         */
+                       status = NT_STATUS_INVALID_NETWORK_RESPONSE;
                        smb2cli_notify_pending(cli, status);
                        TALLOC_FREE(frame);
                        return;
                }
-               smb2cli_req_unset_pending(req);
                state = tevent_req_data(req, struct smb2cli_req_state);
 
+               req_opcode = SVAL(state->hdr, SMB2_HDR_OPCODE);
+               if (opcode != req_opcode) {
+                       status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+                       smb2cli_notify_pending(cli, status);
+                       TALLOC_FREE(frame);
+                       return;
+               }
+
+               if (!(flags & SMB2_HDR_FLAG_REDIRECT)) {
+                       status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+                       smb2cli_notify_pending(cli, status);
+                       TALLOC_FREE(frame);
+                       return;
+               }
+
+               status = NT_STATUS(IVAL(inhdr, SMB2_HDR_STATUS));
+               if ((flags & SMB2_HDR_FLAG_ASYNC) &&
+                   NT_STATUS_EQUAL(status, STATUS_PENDING)) {
+                       uint32_t req_flags = IVAL(state->hdr, SMB2_HDR_FLAGS);
+                       uint64_t async_id = BVAL(inhdr, SMB2_HDR_ASYNC_ID);
+
+                       req_flags |= SMB2_HDR_FLAG_ASYNC;
+                       SBVAL(state->hdr, SMB2_HDR_FLAGS, req_flags);
+                       SBVAL(state->hdr, SMB2_HDR_ASYNC_ID, async_id);
+                       continue;
+               }
+
+               smb2cli_req_unset_pending(req);
+
                /*
                 * There might be more than one response
                 * we need to defer the notifications
                 */
-               tevent_req_defer_callback(req, state->ev);
+               if ((num_iov == 4) && (talloc_array_length(cli->conn.pending) 
== 0)) {
+                       defer = false;
+               }
+
+               if (defer) {
+                       tevent_req_defer_callback(req, state->ev);
+               }
 
                /*
                 * Note: here we use talloc_reference() in a way
@@ -591,6 +642,10 @@ static void smb2cli_inbuf_received(struct tevent_req 
*subreq)
 
        TALLOC_FREE(frame);
 
+       if (!defer) {
+               return;
+       }
+
        num_pending = talloc_array_length(cli->conn.pending);
        if (num_pending == 0) {
                if (state->cli->smb2.mid < UINT64_MAX) {
@@ -622,24 +677,67 @@ static void smb2cli_inbuf_received(struct tevent_req 
*subreq)
 }
 
 NTSTATUS smb2cli_req_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
-                         struct iovec **piov, int body_size)
+                         struct iovec **piov,
+                         const struct smb2cli_req_expected_response *expected,
+                         size_t num_expected)
 {
        struct smb2cli_req_state *state =
                tevent_req_data(req,
                struct smb2cli_req_state);
        NTSTATUS status;
+       size_t body_size;
+       bool found_status = false;
+       bool found_size = false;
+       size_t i;
+
+       if (num_expected == 0) {
+               found_status = true;
+               found_size = true;
+       }
 
        if (tevent_req_is_nterror(req, &status)) {
+               for (i=0; i < num_expected; i++) {
+                       if (NT_STATUS_EQUAL(status, expected[i].status)) {
+                               found_status = true;
+                               break;
+                       }
+               }
+
+               if (found_status) {
+                       return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
+               }
+
                return status;
        }
 
        status = NT_STATUS(IVAL(state->recv_iov[0].iov_base, SMB2_HDR_STATUS));
+       body_size = SVAL(state->recv_iov[1].iov_base, 0);
+
+       for (i=0; i < num_expected; i++) {
+               if (!NT_STATUS_EQUAL(status, expected[i].status)) {
+                       continue;
+               }
+
+               found_status = true;
+               if (expected[i].body_size == 0) {
+                       found_size = true;
+                       break;
+               }
 
-       if (body_size != 0) {
-               if (body_size != SVAL(state->recv_iov[1].iov_base, 0)) {
-                       return NT_STATUS_INVALID_NETWORK_RESPONSE;
+               if (expected[i].body_size == body_size) {
+                       found_size = true;
+                       break;
                }
        }
+
+       if (!found_status) {
+               return status;
+       }
+
+       if (!found_size) {
+               return NT_STATUS_INVALID_NETWORK_RESPONSE;
+       }
+
        if (piov != NULL) {
                *piov = talloc_move(mem_ctx, &state->recv_iov);
        }
diff --git a/source3/libsmb/smb2cli_base.h b/source3/libsmb/smb2cli_base.h
index 348f842..105f8eb 100644
--- a/source3/libsmb/smb2cli_base.h
+++ b/source3/libsmb/smb2cli_base.h
@@ -26,6 +26,7 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
                                      uint16_t cmd,
                                      uint32_t additional_flags,
                                      uint32_t clear_flags,
+                                     unsigned int timeout,
                                      uint32_t pid,
                                      uint32_t tid,
                                      uint64_t uid,
@@ -35,12 +36,19 @@ struct tevent_req *smb2cli_req_create(TALLOC_CTX *mem_ctx,
                                      uint32_t dyn_len);
 NTSTATUS smb2cli_req_compound_submit(struct tevent_req **reqs,
                                     int num_reqs);
+
+struct smb2cli_req_expected_response {
+       NTSTATUS status;
+       uint16_t body_size;
+};
+
 struct tevent_req *smb2cli_req_send(TALLOC_CTX *mem_ctx,
                                    struct tevent_context *ev,
                                    struct cli_state *cli,
                                    uint16_t cmd,
                                    uint32_t additional_flags,
                                    uint32_t clear_flags,
+                                   unsigned int timeout,
                                    uint32_t pid,
                                    uint32_t tid,
                                    uint64_t uid,
@@ -49,6 +57,8 @@ struct tevent_req *smb2cli_req_send(TALLOC_CTX *mem_ctx,
                                    const uint8_t *dyn,
                                    uint32_t dyn_len);
 NTSTATUS smb2cli_req_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
-                         struct iovec **piov, int body_size);
+                         struct iovec **piov,
+                         const struct smb2cli_req_expected_response *expected,
+                         size_t num_expected);
 
 #endif
diff --git a/source3/libsmb/smb2cli_close.c b/source3/libsmb/smb2cli_close.c
index 3c6ad9f..ccd96ea 100644
--- a/source3/libsmb/smb2cli_close.c
+++ b/source3/libsmb/smb2cli_close.c
@@ -55,6 +55,7 @@ struct tevent_req *smb2cli_close_send(TALLOC_CTX *mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_CLOSE,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
@@ -74,8 +75,15 @@ static void smb2cli_close_done(struct tevent_req *subreq)
                struct tevent_req);
        NTSTATUS status;
        struct iovec *iov;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x3C
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, talloc_tos(), &iov, 60);
+       status = smb2cli_req_recv(subreq, talloc_tos(), &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (tevent_req_nterror(req, status)) {
                return;
        }
diff --git a/source3/libsmb/smb2cli_create.c b/source3/libsmb/smb2cli_create.c
index 2145ce2..a0df7da 100644
--- a/source3/libsmb/smb2cli_create.c
+++ b/source3/libsmb/smb2cli_create.c
@@ -138,6 +138,7 @@ struct tevent_req *smb2cli_create_send(
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_CREATE,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
@@ -162,8 +163,15 @@ static void smb2cli_create_done(struct tevent_req *subreq)
        struct iovec *iov;
        uint8_t *body;
        uint32_t offset, length;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x59
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, talloc_tos(), &iov, 89);
+       status = smb2cli_req_recv(subreq, talloc_tos(), &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (tevent_req_nterror(req, status)) {
                return;
        }
diff --git a/source3/libsmb/smb2cli_flush.c b/source3/libsmb/smb2cli_flush.c
index 6fe7178..ea15f25 100644
--- a/source3/libsmb/smb2cli_flush.c
+++ b/source3/libsmb/smb2cli_flush.c
@@ -53,6 +53,7 @@ struct tevent_req *smb2cli_flush_send(TALLOC_CTX *mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_FLUSH,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
@@ -72,8 +73,15 @@ static void smb2cli_flush_done(struct tevent_req *subreq)
                struct tevent_req);
        NTSTATUS status;
        struct iovec *iov;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x04
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, talloc_tos(), &iov, 60);
+       status = smb2cli_req_recv(subreq, talloc_tos(), &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (tevent_req_nterror(req, status)) {
                return;
        }
diff --git a/source3/libsmb/smb2cli_negprot.c b/source3/libsmb/smb2cli_negprot.c
index df35225..dec6c4c 100644
--- a/source3/libsmb/smb2cli_negprot.c
+++ b/source3/libsmb/smb2cli_negprot.c
@@ -68,6 +68,7 @@ struct tevent_req *smb2cli_negprot_send(TALLOC_CTX *mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_NEGPROT,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  0, 0, /* tid, uid */
                                  state->fixed, sizeof(state->fixed),
@@ -93,8 +94,15 @@ static void smb2cli_negprot_done(struct tevent_req *subreq)
        NTSTATUS status;
        struct iovec *iov;
        uint8_t *body;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x41
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, talloc_tos(), &iov, 65);
+       status = smb2cli_req_recv(subreq, talloc_tos(), &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(subreq);
                tevent_req_nterror(req, status);
diff --git a/source3/libsmb/smb2cli_query_directory.c 
b/source3/libsmb/smb2cli_query_directory.c
index 4a0e69b..2d2c465 100644
--- a/source3/libsmb/smb2cli_query_directory.c
+++ b/source3/libsmb/smb2cli_query_directory.c
@@ -88,6 +88,7 @@ struct tevent_req *smb2cli_query_directory_send(TALLOC_CTX 
*mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_FIND,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
@@ -111,8 +112,15 @@ static void smb2cli_query_directory_done(struct tevent_req 
*subreq)
        NTSTATUS status;
        struct iovec *iov;
        uint16_t data_offset;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x09
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, state, &iov, 9);
+       status = smb2cli_req_recv(subreq, state, &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (tevent_req_nterror(req, status)) {
                return;
        }
diff --git a/source3/libsmb/smb2cli_read.c b/source3/libsmb/smb2cli_read.c
index e45a75f..75754fe 100644
--- a/source3/libsmb/smb2cli_read.c
+++ b/source3/libsmb/smb2cli_read.c
@@ -67,6 +67,7 @@ struct tevent_req *smb2cli_read_send(TALLOC_CTX *mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_READ,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  cli->smb2.tid,
                                  cli->smb2.uid,
@@ -89,8 +90,19 @@ static void smb2cli_read_done(struct tevent_req *subreq)
        NTSTATUS status;
        struct iovec *iov;
        uint8_t data_offset;
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = STATUS_BUFFER_OVERFLOW,
+               .body_size = 0x11
+       },
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x11
+       }
+       };
 
-       status = smb2cli_req_recv(subreq, state, &iov, 17);
+       status = smb2cli_req_recv(subreq, state, &iov,
+                                 expected, ARRAY_SIZE(expected));
        if (tevent_req_nterror(req, status)) {
                return;
        }
diff --git a/source3/libsmb/smb2cli_session.c b/source3/libsmb/smb2cli_session.c
index 4ffdf13..28b8f91 100644
--- a/source3/libsmb/smb2cli_session.c
+++ b/source3/libsmb/smb2cli_session.c
@@ -75,6 +75,7 @@ static struct tevent_req 
*smb2cli_sesssetup_blob_send(TALLOC_CTX *mem_ctx,
 
        subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_SESSSETUP,
                                  0, 0, /* flags */
+                                 cli->timeout,
                                  cli->smb2.pid,
                                  0, /* tid */
                                  cli->smb2.uid,
@@ -98,8 +99,19 @@ static void smb2cli_sesssetup_blob_done(struct tevent_req 
*subreq)
        NTSTATUS status;
        struct iovec *iov;
        uint16_t offset, length;
-
-       status = smb2cli_req_recv(subreq, talloc_tos(), &iov, 9);
+       static const struct smb2cli_req_expected_response expected[] = {
+       {
+               .status = NT_STATUS_MORE_PROCESSING_REQUIRED,
+               .body_size = 0x09
+       },
+       {
+               .status = NT_STATUS_OK,
+               .body_size = 0x09
+       }
+       };


-- 
Samba Shared Repository

Reply via email to