dcerpc.idl: make use of union dcerpc_bind_ack_reason and fix all callers.
authorStefan Metzmacher <metze@samba.org>
Thu, 9 Jan 2014 15:00:23 +0000 (16:00 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 16 Jan 2014 17:21:40 +0000 (18:21 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
Autobuild-User(master): Günther Deschner <gd@samba.org>
Autobuild-Date(master): Thu Jan 16 18:21:40 CET 2014 on sn-devel-104

librpc/idl/dcerpc.idl
source3/rpc_client/cli_pipe.c
source3/rpc_server/srv_pipe.c
source4/librpc/rpc/dcerpc.c
source4/rpc_server/dcerpc_server.c

index 5fb7377d76f06d205a4f634457678f075c87525f..1ffa784b24c66260a8aba970e91f2d34035d6fe6 100644 (file)
@@ -94,7 +94,7 @@ interface dcerpc
 
        typedef struct {
                dcerpc_bind_ack_result result;
-               uint16 reason;
+               [switch_is(result)] dcerpc_bind_ack_reason reason;
                ndr_syntax_id syntax;
        } dcerpc_ack_ctx;
 
index 1b049de4c00dddcd40bd6ed8f3a1167ab7b035d0..e4e2bfe17fc7fc062edf1793ec74d0a91103fdfa 100644 (file)
@@ -1620,7 +1620,7 @@ static bool check_bind_response(const struct dcerpc_bind_ack *r,
 
        if (r->num_results != 0x1 || ctx.result != 0) {
                DEBUG(2,("bind_rpc_pipe: bind denied results: %d reason: %x\n",
-                         r->num_results, ctx.reason));
+                         r->num_results, ctx.reason.value));
        }
 
        DEBUG(5,("check_bind_response: accepted!\n"));
index b219ee98b21ae445b32de72b92cae900596ad0ae..3f6f3dc38e6cb9413bc5915a667466a9afbd943c 100644 (file)
@@ -651,13 +651,13 @@ static bool api_pipe_bind_req(struct pipes_struct *p,
                        pkt->u.bind.ctx_list[0].context_id)) {
 
                bind_ack_ctx.result = 0;
-               bind_ack_ctx.reason = 0;
+               bind_ack_ctx.reason.value = 0;
                bind_ack_ctx.syntax = pkt->u.bind.ctx_list[0].transfer_syntaxes[0];
        } else {
                p->pipe_bound = False;
                /* Rejection reason: abstract syntax not supported */
                bind_ack_ctx.result = DCERPC_BIND_PROVIDER_REJECT;
-               bind_ack_ctx.reason = DCERPC_BIND_REASON_ASYNTAX;
+               bind_ack_ctx.reason.value = DCERPC_BIND_REASON_ASYNTAX;
                bind_ack_ctx.syntax = ndr_syntax_id_null;
        }
 
@@ -1009,13 +1009,13 @@ static bool api_pipe_alter_context(struct pipes_struct *p,
                        pkt->u.bind.ctx_list[0].context_id)) {
 
                bind_ack_ctx.result = 0;
-               bind_ack_ctx.reason = 0;
+               bind_ack_ctx.reason.value = 0;
                bind_ack_ctx.syntax = pkt->u.bind.ctx_list[0].transfer_syntaxes[0];
        } else {
                p->pipe_bound = False;
                /* Rejection reason: abstract syntax not supported */
                bind_ack_ctx.result = DCERPC_BIND_PROVIDER_REJECT;
-               bind_ack_ctx.reason = DCERPC_BIND_REASON_ASYNTAX;
+               bind_ack_ctx.reason.value = DCERPC_BIND_REASON_ASYNTAX;
                bind_ack_ctx.syntax = ndr_syntax_id_null;
        }
 
index 5a2fe16c2f38a2c229062943199816da63f5dd8f..1efa85e704ebe8282bc32d956bbae86e4284f2a7 100644 (file)
@@ -1006,7 +1006,17 @@ static NTSTATUS dcerpc_map_ack_reason(const struct dcerpc_ack_ctx *ack)
                return NT_STATUS_RPC_PROTOCOL_ERROR;
        }
 
-       switch (ack->reason) {
+       switch (ack->result) {
+       case DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK:
+               /*
+                * We have not asked for this...
+                */
+               return NT_STATUS_RPC_PROTOCOL_ERROR;
+       default:
+               break;
+       }
+
+       switch (ack->reason.value) {
        case DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED:
                return NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX;
        case DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED:
@@ -2180,7 +2190,7 @@ static void dcerpc_alter_context_recv_handler(struct rpc_request *subreq,
            pkt->u.alter_resp.ctx_list[0].result != 0) {
                status = dcerpc_map_ack_reason(&pkt->u.alter_resp.ctx_list[0]);
                DEBUG(2,("dcerpc: alter_resp failed - reason %d - %s\n",
-                        pkt->u.alter_resp.ctx_list[0].reason,
+                        pkt->u.alter_resp.ctx_list[0].reason.value,
                         nt_errstr(status)));
                tevent_req_nterror(req, status);
                return;
index d82ef9c80b6fd85d8bac7f0cecb86726caddb48a..6ab355f2fdbbe75d72def69ca1dcec85f9ca272a 100644 (file)
@@ -640,7 +640,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
                return NT_STATUS_NO_MEMORY;
        }
        pkt.u.bind_ack.ctx_list[0].result = result;
-       pkt.u.bind_ack.ctx_list[0].reason = reason;
+       pkt.u.bind_ack.ctx_list[0].reason.value = reason;
        pkt.u.bind_ack.ctx_list[0].syntax = ndr_transfer_syntax_ndr;
        pkt.u.bind_ack.auth_info = data_blob(NULL, 0);
 
@@ -829,7 +829,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
                return NT_STATUS_NO_MEMORY;
        }
        pkt.u.alter_resp.ctx_list[0].result = result;
-       pkt.u.alter_resp.ctx_list[0].reason = reason;
+       pkt.u.alter_resp.ctx_list[0].reason.value = reason;
        pkt.u.alter_resp.ctx_list[0].syntax = ndr_transfer_syntax_ndr;
        pkt.u.alter_resp.auth_info = data_blob(NULL, 0);
        pkt.u.alter_resp.secondary_address = "";