smb2srv: async replies with STATUS_PENDING are not signed
authorStefan Metzmacher <metze@samba.org>
Wed, 13 Aug 2008 07:48:44 +0000 (09:48 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 14 Aug 2008 11:13:50 +0000 (13:13 +0200)
..., but the they may have the sign flag set.

metze

source/smb_server/smb2/receive.c

index bcc91e4ee3c53e932fc31916a95ed6b84e7ea95f..1fe6f0b877ef0ceb028452fdb3fa7bbf131f0fe5 100644 (file)
@@ -506,6 +506,8 @@ static NTSTATUS smb2srv_init_pending(struct smbsrv_connection *smb_conn)
 
 NTSTATUS smb2srv_queue_pending(struct smb2srv_request *req)
 {
+       NTSTATUS status;
+       bool signing_used = false;
        int id;
 
        if (req->pending_id) {
@@ -521,10 +523,35 @@ NTSTATUS smb2srv_queue_pending(struct smb2srv_request *req)
        DLIST_ADD_END(req->smb_conn->requests2.list, req, struct smb2srv_request *);
        req->pending_id = id;
 
+       if (req->smb_conn->connection->event.fde == NULL) {
+               /* the socket has been destroyed - no point trying to send an error! */
+               return NT_STATUS_REMOTE_DISCONNECT;
+       }
+
        talloc_set_destructor(req, smb2srv_request_deny_destructor);
-       smb2srv_send_error(req, STATUS_PENDING);
-       talloc_set_destructor(req, smb2srv_request_destructor);
 
+       status = smb2srv_setup_reply(req, 8, true, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(STATUS_PENDING));
+
+       SSVAL(req->out.body, 0x02, 0);
+       SIVAL(req->out.body, 0x04, 0);
+
+       /* if the real reply will be signed set the signed flags, but don't sign */
+       if (req->is_signed) {
+               SIVAL(req->out.hdr, SMB2_HDR_FLAGS, IVAL(req->out.hdr, SMB2_HDR_FLAGS) | SMB2_HDR_FLAG_SIGNED);
+               signing_used = req->is_signed;
+               req->is_signed = false;
+       }
+
+       smb2srv_send_reply(req);
+
+       req->is_signed = signing_used;
+
+       talloc_set_destructor(req, smb2srv_request_destructor);
        return NT_STATUS_OK;
 }