s3:smb2_create: don't take 'state->te' as indication for "was_deferred" (bug #9196)
authorStefan Metzmacher <metze@samba.org>
Wed, 26 Sep 2012 01:04:20 +0000 (03:04 +0200)
committerKarolin Seeger <kseeger@samba.org>
Mon, 1 Oct 2012 07:17:14 +0000 (09:17 +0200)
We always set state->te = NULL of TALLOC_FREE(state->te),
before calling smbd_smb2_request_dispatch(), so
open_was_deferred_smb2() always returned false, while dispatching
it again.

But it's remove_deferred_open_message_smb2_internal() which
should reset this state.

In developer mode validate_my_share_entries() did call smb_panic()
before.

metze
(cherry picked from commit 4604219ceba96955b3c4bf6ab31aa70c11442d61)

source3/smbd/smb2_create.c

index c6e3fc3006db212331895d598a200297b697ddaf..5a9044d8d74a89d289ff60ddeb9e7a2df28986b6 100644 (file)
@@ -386,6 +386,7 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
 struct smbd_smb2_create_state {
        struct smbd_smb2_request *smb2req;
        struct smb_request *smb1req;
+       bool open_was_deferred;
        struct timed_event *te;
        struct tevent_immediate *im;
        struct timeval request_time;
@@ -964,7 +965,7 @@ bool open_was_deferred_smb2(struct smbd_server_connection *sconn, uint64_t mid)
                return false;
        }
        /* It's not in progress if there's no timeout event. */
-       if (!state->te) {
+       if (!state->open_was_deferred) {
                return false;
        }
 
@@ -995,6 +996,7 @@ static void remove_deferred_open_message_smb2_internal(struct smbd_smb2_request
                "mid %llu\n",
                (unsigned long long)mid ));
 
+       state->open_was_deferred = false;
        /* Ensure we don't have any outstanding timer event. */
        TALLOC_FREE(state->te);
        /* Ensure we don't have any outstanding immediate event. */
@@ -1238,6 +1240,7 @@ bool push_deferred_open_message_smb2(struct smbd_smb2_request *smb2req,
                                &end_time,
                                true) ));
 
+       state->open_was_deferred = true;
        state->te = event_add_timed(smb2req->sconn->smb2.event_ctx,
                                state,
                                end_time,