summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/librpc/idl/epmapper.idl8
-rw-r--r--source4/librpc/ndr/ndr_basic.c3
-rw-r--r--source4/torture/rpc/epmapper.c78
3 files changed, 62 insertions, 27 deletions
diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl
index 5c433dd2ca..172c83149b 100644
--- a/source4/librpc/idl/epmapper.idl
+++ b/source4/librpc/idl/epmapper.idl
@@ -30,7 +30,7 @@ interface epmapper
typedef [nodiscriminant] union {
[case(13)] epm_prot_uuid uuid;
- [default] ;
+ [default] [flag(NDR_REMAINING)] DATA_BLOB lhs_data;
} epm_protocol_info;
typedef struct {
@@ -39,7 +39,7 @@ interface epmapper
} epm_lhs;
typedef struct {
- [flag(NDR_REMAINING)] DATA_BLOB data;
+ [flag(NDR_REMAINING)] DATA_BLOB rhs_data;
} epm_rhs;
typedef struct {
@@ -47,10 +47,10 @@ interface epmapper
[subcontext(2)] epm_rhs rhs;
} epm_floor;
- /* not that the NDR_NOALIGN flag is inherited by all nested
+ /* note that the NDR_NOALIGN flag is inherited by all nested
structures. All of the towers/floors stuff is
non-aligned. I wonder what sort of wicked substance these
- guys were smoking?
+ guys were smoking?
*/
typedef [flag(NDR_NOALIGN)] struct {
uint16 num_floors;
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c
index a45771ef28..1f78bc17b6 100644
--- a/source4/librpc/ndr/ndr_basic.c
+++ b/source4/librpc/ndr/ndr_basic.c
@@ -782,6 +782,9 @@ void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *
void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_BLOB r)
{
ndr->print(ndr, "%-25s: DATA_BLOB length=%u", name, r.length);
+ if (r.length) {
+ dump_data(10, r.data, r.length);
+ }
}
diff --git a/source4/torture/rpc/epmapper.c b/source4/torture/rpc/epmapper.c
index d0f3181564..de3b0b67d2 100644
--- a/source4/torture/rpc/epmapper.c
+++ b/source4/torture/rpc/epmapper.c
@@ -48,47 +48,40 @@ static void display_tower(TALLOC_CTX *mem_ctx, struct epm_towers *twr)
case 0x9:
printf(" IP:");
- if (rhs->data.length == 4) {
+ if (rhs->rhs_data.length == 4) {
struct in_addr in;
- in.s_addr = RIVAL(rhs->data.data, 0);
+ in.s_addr = RIVAL(rhs->rhs_data.data, 0);
printf("%s", inet_ntoa(in));
}
break;
case 0x10:
- printf(" PIPE:%.*s", rhs->data.length, rhs->data.data);
+ printf(" PIPE:%.*s", rhs->rhs_data.length, rhs->rhs_data.data);
break;
case 0x0f:
- printf(" SMBNP:%.*s", rhs->data.length, rhs->data.data);
+ printf(" SMB:%.*s", rhs->rhs_data.length, rhs->rhs_data.data);
break;
case 0x11:
- printf(" SMB:%.*s", rhs->data.length, rhs->data.data);
+ printf(" NetBIOS:%.*s", rhs->rhs_data.length, rhs->rhs_data.data);
break;
case 0x01:
- printf(" UNK(1):%.*s", rhs->data.length, rhs->data.data);
+ printf(" UNK(1):%.*s", rhs->rhs_data.length, rhs->rhs_data.data);
break;
case 0x1f:
printf(" TCP:");
- if (rhs->data.length == 2) {
- printf("%d", SVAL(rhs->data.data, 0));
- }
- break;
-
- case 0x07:
- printf(" XXX:");
- if (rhs->data.length == 2) {
- printf("%d", SVAL(rhs->data.data, 0));
+ if (rhs->rhs_data.length == 2) {
+ printf("%d", SVAL(rhs->rhs_data.data, 0));
}
break;
default:
printf(" UNK(%02x):", lhs->protocol);
- if (rhs->data.length == 2) {
- printf("%d", SVAL(rhs->data.data, 0));
+ if (rhs->rhs_data.length == 2) {
+ printf("%d", SVAL(rhs->rhs_data.data, 0));
}
break;
}
@@ -96,6 +89,43 @@ static void display_tower(TALLOC_CTX *mem_ctx, struct epm_towers *twr)
printf("\n");
}
+
+static BOOL test_Map(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+ struct epm_twr_t *twr)
+{
+ NTSTATUS status;
+ struct epm_Map r;
+ GUID uuid;
+ struct policy_handle handle;
+ int i;
+
+ ZERO_STRUCT(uuid);
+ ZERO_STRUCT(handle);
+
+ r.in.object = &uuid;
+ r.in.map_tower = twr;
+ r.in.entry_handle = &handle;
+ r.out.entry_handle = &handle;
+ r.in.max_towers = 100;
+
+ status = dcerpc_epm_Map(p, mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status) || r.out.status != 0) {
+ printf("epm_Map failed - %s/0x%x\n",
+ nt_errstr(status), r.out.status);
+ return False;
+ }
+
+ printf("epm_Map results:\n");
+
+ for (i=0;i<r.out.num_towers;i++) {
+ if (r.out.towers[i].twr) {
+ display_tower(mem_ctx, &r.out.towers[i].twr->towers);
+ }
+ }
+
+ return True;
+}
+
static BOOL test_Lookup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
NTSTATUS status;
@@ -117,13 +147,15 @@ static BOOL test_Lookup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
r.in.max_ents = 10;
do {
+ int i;
status = dcerpc_epm_Lookup(p, mem_ctx, &r);
- if (NT_STATUS_IS_OK(status) && r.out.status == 0) {
- int i;
- for (i=0;i<r.out.num_ents;i++) {
- printf("Found '%s'\n", r.out.entries[i].annotation);
- display_tower(mem_ctx, &r.out.entries[i].tower->towers);
- }
+ if (!NT_STATUS_IS_OK(status) || r.out.status != 0) {
+ break;
+ }
+ for (i=0;i<r.out.num_ents;i++) {
+ printf("\nFound '%s'\n", r.out.entries[i].annotation);
+ display_tower(mem_ctx, &r.out.entries[i].tower->towers);
+ test_Map(p, mem_ctx, r.out.entries[i].tower);
}
} while (NT_STATUS_IS_OK(status) &&
r.out.status == 0 &&