diff options
-rw-r--r-- | source4/torture/rpc/epmapper.c | 94 |
1 files changed, 77 insertions, 17 deletions
diff --git a/source4/torture/rpc/epmapper.c b/source4/torture/rpc/epmapper.c index 00bdbb5792..c42f7456f9 100644 --- a/source4/torture/rpc/epmapper.c +++ b/source4/torture/rpc/epmapper.c @@ -40,51 +40,54 @@ static void display_tower(struct torture_context *tctx, struct epm_tower *twr) torture_comment(tctx, "\n"); } - static bool test_Map(struct dcerpc_binding_handle *b, - TALLOC_CTX *mem_ctx, + struct torture_context *tctx, struct epm_twr_t *twr) { NTSTATUS status; struct epm_Map r; struct GUID uuid; struct policy_handle handle; - int i; struct ndr_syntax_id syntax; uint32_t num_towers; + uint32_t i; ZERO_STRUCT(uuid); ZERO_STRUCT(handle); r.in.object = &uuid; r.in.map_tower = twr; - r.in.entry_handle = &handle; + r.in.entry_handle = &handle; r.out.entry_handle = &handle; - r.in.max_towers = 100; + r.in.max_towers = 10; r.out.num_towers = &num_towers; dcerpc_floor_get_lhs_data(&twr->tower.floors[0], &syntax); - printf("epm_Map results for '%s':\n", - ndr_interface_name(&syntax.uuid, syntax.if_version)); + torture_comment(tctx, + "epm_Map results for '%s':\n", + ndr_interface_name(&syntax.uuid, syntax.if_version)); + /* RPC protocol identifier */ twr->tower.floors[2].lhs.protocol = EPM_PROTOCOL_NCACN; twr->tower.floors[2].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[2].rhs.ncacn.minor_version = 0; + /* Port address */ twr->tower.floors[3].lhs.protocol = EPM_PROTOCOL_TCP; twr->tower.floors[3].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[3].rhs.tcp.port = 0; + /* Transport */ twr->tower.floors[4].lhs.protocol = EPM_PROTOCOL_IP; twr->tower.floors[4].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[4].rhs.ip.ipaddr = "0.0.0.0"; - status = dcerpc_epm_Map_r(b, mem_ctx, &r); + status = dcerpc_epm_Map_r(b, tctx, &r); if (NT_STATUS_IS_OK(status) && r.out.result == 0) { for (i=0;i<*r.out.num_towers;i++) { if (r.out.towers[i].twr) { - display_tower(mem_ctx, &r.out.towers[i].twr->tower); + display_tower(tctx, &r.out.towers[i].twr->tower); } } } @@ -93,11 +96,11 @@ static bool test_Map(struct dcerpc_binding_handle *b, twr->tower.floors[3].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[3].rhs.http.port = 0; - status = dcerpc_epm_Map_r(b, mem_ctx, &r); + status = dcerpc_epm_Map_r(b, tctx, &r); if (NT_STATUS_IS_OK(status) && r.out.result == 0) { for (i=0;i<*r.out.num_towers;i++) { if (r.out.towers[i].twr) { - display_tower(mem_ctx, &r.out.towers[i].twr->tower); + display_tower(tctx, &r.out.towers[i].twr->tower); } } } @@ -106,11 +109,11 @@ static bool test_Map(struct dcerpc_binding_handle *b, twr->tower.floors[3].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[3].rhs.http.port = 0; - status = dcerpc_epm_Map_r(b, mem_ctx, &r); + status = dcerpc_epm_Map_r(b, tctx, &r); if (NT_STATUS_IS_OK(status) && r.out.result == 0) { for (i=0;i<*r.out.num_towers;i++) { if (r.out.towers[i].twr) { - display_tower(mem_ctx, &r.out.towers[i].twr->tower); + display_tower(tctx, &r.out.towers[i].twr->tower); } } } @@ -123,17 +126,70 @@ static bool test_Map(struct dcerpc_binding_handle *b, twr->tower.floors[4].lhs.lhs_data = data_blob(NULL, 0); twr->tower.floors[4].rhs.netbios.name = ""; - status = dcerpc_epm_Map_r(b, mem_ctx, &r); + status = dcerpc_epm_Map_r(b, tctx, &r); if (NT_STATUS_IS_OK(status) && r.out.result == 0) { - for (i=0;i<*r.out.num_towers;i++) { + for (i = 0; i < *r.out.num_towers; i++) { if (r.out.towers[i].twr) { - display_tower(mem_ctx, &r.out.towers[i].twr->tower); + display_tower(tctx, &r.out.towers[i].twr->tower); } } } /* FIXME: Extend to do other protocols as well (ncacn_unix_stream, ncalrpc) */ - + + return true; +} + +static bool test_Map_simple(struct torture_context *tctx, + struct dcerpc_pipe *p) +{ + NTSTATUS status; + struct epm_Lookup r; + struct policy_handle entry_handle; + uint32_t num_ents = 0; + struct dcerpc_binding_handle *h = p->binding_handle; + + ZERO_STRUCT(entry_handle); + + torture_comment(tctx, "Testing epm_Map\n"); + + /* get all elements */ + r.in.inquiry_type = RPC_C_EP_ALL_ELTS; + r.in.object = NULL; + r.in.interface_id = NULL; + r.in.vers_option = RPC_C_VERS_ALL; + + r.in.entry_handle = &entry_handle; + r.in.max_ents = 10; + + r.out.entry_handle = &entry_handle; + r.out.num_ents = &num_ents; + + do { + int i; + + status = dcerpc_epm_Lookup_r(h, tctx, &r); + if (!NT_STATUS_IS_OK(status) || + r.out.result != EPMAPPER_STATUS_OK) { + break; + } + + for (i = 0; i < *r.out.num_ents; i++) { + if (r.out.entries[i].tower->tower.num_floors == 5) { + test_Map(h, tctx, r.out.entries[i].tower); + } + } + } while (NT_STATUS_IS_OK(status) && + r.out.result == EPMAPPER_STATUS_OK && + *r.out.num_ents == r.in.max_ents && + !policy_handle_empty(&entry_handle)); + + torture_assert_ntstatus_ok(tctx, status, "epm_Map_simple failed"); + + torture_assert(tctx, + policy_handle_empty(&entry_handle), + "epm_Map_simple failed - The policy handle should be emtpy."); + return true; } @@ -402,6 +458,10 @@ struct torture_suite *torture_rpc_epmapper(TALLOC_CTX *mem_ctx) torture_rpc_tcase_add_test(tcase, "Lookup_simple", test_Lookup_simple); + torture_rpc_tcase_add_test(tcase, + "Map_simple", + test_Map_simple); + return suite; } |