smbd: Fix a profile problem
[samba.git] / source3 / smbd / smb2_create.c
index c6e3fc3006db212331895d598a200297b697ddaf..08629901427c263b23d8b5ea0073e70320c0e220 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;
@@ -693,7 +694,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                                          smb1req->conn,
                                          smb1req->flags2 & FLAGS2_DFS_PATHNAMES,
                                          fname,
-                                         0,
+                                         (in_create_disposition == FILE_CREATE) ?
+                                               UCF_CREATING_FILE : 0,
                                          NULL,
                                          &smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
@@ -892,9 +894,6 @@ bool get_deferred_open_message_state_smb2(struct smbd_smb2_request *smb2req,
        if (!smb2req) {
                return false;
        }
-       if (!smb2req->async) {
-               return false;
-       }
        req = smb2req->subreq;
        if (!req) {
                return false;
@@ -903,6 +902,9 @@ bool get_deferred_open_message_state_smb2(struct smbd_smb2_request *smb2req,
        if (!state) {
                return false;
        }
+       if (!state->open_was_deferred) {
+               return false;
+       }
        if (p_request_time) {
                *p_request_time = state->request_time;
        }
@@ -964,7 +966,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 +997,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 +1241,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,