s3-dcerpc: use dcerpc_push_ncacn_packet() in create_rpc_bind_auth3()
authorSimo Sorce <idra@samba.org>
Thu, 8 Jul 2010 17:30:50 +0000 (13:30 -0400)
committerSimo Sorce <idra@samba.org>
Thu, 8 Jul 2010 22:38:55 +0000 (18:38 -0400)
source3/rpc_client/cli_pipe.c

index 9c6982bed2716322cdf461805ecf943e06607769..49df252230f3ef9112f8e28fab09d5b7264d3cb9 100644 (file)
@@ -2713,48 +2713,43 @@ static NTSTATUS create_rpc_bind_auth3(struct rpc_pipe_client *cli,
                                DATA_BLOB *pauth_blob,
                                prs_struct *rpc_out)
 {
-       RPC_HDR hdr;
-       RPC_HDR_AUTH hdr_auth;
-       uint32 pad = 0;
-
-       /* Create the request RPC_HDR */
-       init_rpc_hdr(&hdr, DCERPC_PKT_AUTH3, DCERPC_PFC_FLAG_FIRST|DCERPC_PFC_FLAG_LAST, rpc_call_id,
-                    RPC_HEADER_LEN + 4 /* pad */ + RPC_HDR_AUTH_LEN + pauth_blob->length,
-                    pauth_blob->length );
-
-       /* Marshall it. */
-       if(!smb_io_rpc_hdr("hdr", &hdr, rpc_out, 0)) {
-               DEBUG(0,("create_rpc_bind_auth3: failed to marshall RPC_HDR.\n"));
-               return NT_STATUS_NO_MEMORY;
-       }
+       uint16_t auth_len = pauth_blob->length;
+       uint16_t frag_len = 0;
+       NTSTATUS status;
+       union dcerpc_payload u;
+       DATA_BLOB blob;
 
-       /*
-               I'm puzzled about this - seems to violate the DCE RPC auth rules,
-               about padding - shouldn't this pad to length CLIENT_NDR_PADDING_SIZE ? JRA.
-       */
+       u.auth3._pad = 0;
 
-       /* 4 bytes padding. */
-       if (!prs_uint32("pad", rpc_out, 0, &pad)) {
-               DEBUG(0,("create_rpc_bind_auth3: failed to marshall 4 byte pad.\n"));
-               return NT_STATUS_NO_MEMORY;
+       status = dcerpc_push_dcerpc_auth(prs_get_mem_context(rpc_out),
+                       map_pipe_auth_type_to_rpc_auth_type(auth_type),
+                                        auth_level,
+                                        0, /* auth_pad_length */
+                                        1, /* auth_context_id */
+                                        pauth_blob,
+                                        &u.auth3.auth_info);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
-       /* Create the request RPC_HDR_AUTHA */
-       init_rpc_hdr_auth(&hdr_auth,
-                       map_pipe_auth_type_to_rpc_auth_type(auth_type),
-                       auth_level, 0, 1);
+       /* Start building the frag length. */
+       frag_len = RPC_HEADER_LEN + 4 /* pad */ + RPC_HDR_AUTH_LEN + auth_len;
 
-       if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, rpc_out, 0)) {
-               DEBUG(0,("create_rpc_bind_auth3: failed to marshall RPC_HDR_AUTHA.\n"));
-               return NT_STATUS_NO_MEMORY;
+       status = dcerpc_push_ncacn_packet(prs_get_mem_context(rpc_out),
+                                         DCERPC_PKT_AUTH3,
+                                         DCERPC_PFC_FLAG_FIRST |
+                                         DCERPC_PFC_FLAG_LAST,
+                                         frag_len,
+                                         auth_len ? auth_len - RPC_HDR_AUTH_LEN : 0,
+                                         rpc_call_id,
+                                         u,
+                                         &blob);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("create_bind_or_alt_ctx_internal: failed to marshall RPC_HDR_RB.\n"));
+               return status;
        }
 
-       /*
-        * Append the auth data to the outgoing buffer.
-        */
-
-       if(!prs_copy_data_in(rpc_out, (char *)pauth_blob->data, pauth_blob->length)) {
-               DEBUG(0,("create_rpc_bind_auth3: failed to marshall auth blob.\n"));
+       if (!prs_copy_data_in(rpc_out, (char *)blob.data, blob.length)) {
                return NT_STATUS_NO_MEMORY;
        }