mirror of
https://github.com/samba-team/samba.git
synced 2025-01-22 22:04:08 +03:00
added rpcecho EchoData test
(This used to be commit 9c7e4db4712d1b2b7d8125e3ae535efd50b80f58)
This commit is contained in:
parent
87ef172531
commit
399fff106d
@ -91,7 +91,19 @@ NTSTATUS ndr_pull_u32(struct ndr_pull *ndr, uint32 *v)
|
|||||||
} else {
|
} else {
|
||||||
*v = IVAL(ndr->data, ndr->offset);
|
*v = IVAL(ndr->data, ndr->offset);
|
||||||
}
|
}
|
||||||
ndr->offset += 2;
|
ndr->offset += 4;
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
parse a set of bytes
|
||||||
|
*/
|
||||||
|
NTSTATUS ndr_pull_bytes(struct ndr_pull *ndr, char **data, uint32 n)
|
||||||
|
{
|
||||||
|
NDR_PULL_NEED_BYTES(ndr, n);
|
||||||
|
NDR_ALLOC_N(ndr, *data, n);
|
||||||
|
memcpy(*data, ndr->data + ndr->offset, n);
|
||||||
|
ndr->offset += n;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,3 +150,14 @@ NTSTATUS ndr_push_u32(struct ndr_push *ndr, uint32 v)
|
|||||||
ndr->offset += 4;
|
ndr->offset += 4;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
push some bytes
|
||||||
|
*/
|
||||||
|
NTSTATUS ndr_push_bytes(struct ndr_push *ndr, const char *data, uint32 n)
|
||||||
|
{
|
||||||
|
NDR_PUSH_NEED_BYTES(ndr, n);
|
||||||
|
memcpy(ndr->data + ndr->offset, data, n);
|
||||||
|
ndr->offset += n;
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
@ -44,3 +44,27 @@ NTSTATUS ndr_push_rpcecho_addone(struct ndr_push *ndr,
|
|||||||
NDR_CHECK(ndr_push_u32(ndr, r->in.data));
|
NDR_CHECK(ndr_push_u32(ndr, r->in.data));
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
parse a echodata
|
||||||
|
*/
|
||||||
|
NTSTATUS ndr_pull_rpcecho_echodata(struct ndr_pull *ndr,
|
||||||
|
struct rpcecho_echodata *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_pull_u32(ndr, &r->out.len));
|
||||||
|
NDR_CHECK(ndr_pull_bytes(ndr, &r->out.data, r->out.len));
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
push a echodata
|
||||||
|
*/
|
||||||
|
NTSTATUS ndr_push_rpcecho_echodata(struct ndr_push *ndr,
|
||||||
|
struct rpcecho_echodata *r)
|
||||||
|
{
|
||||||
|
NDR_CHECK(ndr_push_u32(ndr, r->in.len));
|
||||||
|
NDR_CHECK(ndr_push_u32(ndr, r->in.len));
|
||||||
|
NDR_CHECK(ndr_push_bytes(ndr, r->in.data, r->in.len));
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
@ -35,6 +35,18 @@ struct rpcecho_addone {
|
|||||||
} out;
|
} out;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* EchoData interface */
|
||||||
|
struct rpcecho_echodata {
|
||||||
|
struct {
|
||||||
|
int len;
|
||||||
|
const char *data;
|
||||||
|
} in;
|
||||||
|
struct {
|
||||||
|
int len;
|
||||||
|
char *data;
|
||||||
|
} out;
|
||||||
|
};
|
||||||
|
|
||||||
/* define the command codes */
|
/* define the command codes */
|
||||||
enum {
|
enum {
|
||||||
RPCECHO_CALL_ADDONE=0,
|
RPCECHO_CALL_ADDONE=0,
|
||||||
|
@ -52,3 +52,34 @@ NTSTATUS dcerpc_rpcecho_addone(struct dcerpc_pipe *p,
|
|||||||
talloc_destroy(mem_ctx);
|
talloc_destroy(mem_ctx);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
echodata interface
|
||||||
|
*/
|
||||||
|
NTSTATUS dcerpc_rpcecho_echodata(struct dcerpc_pipe *p,
|
||||||
|
TALLOC_CTX *mem_ctx,
|
||||||
|
int len,
|
||||||
|
const char *in_data,
|
||||||
|
int *out_len,
|
||||||
|
char **out_data)
|
||||||
|
{
|
||||||
|
struct rpcecho_echodata r;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
/* fill the .in side of the call */
|
||||||
|
r.in.len = len;
|
||||||
|
r.in.data = in_data;
|
||||||
|
|
||||||
|
/* make the call */
|
||||||
|
status = dcerpc_ndr_request(p, RPCECHO_CALL_ECHODATA, mem_ctx,
|
||||||
|
(ndr_push_fn_t) ndr_push_rpcecho_echodata,
|
||||||
|
(ndr_pull_fn_t) ndr_pull_rpcecho_echodata,
|
||||||
|
&r);
|
||||||
|
|
||||||
|
/* and extract the .out parameters */
|
||||||
|
*out_len = r.out.len;
|
||||||
|
*out_data = r.out.data;
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@ -45,6 +45,44 @@ static BOOL test_addone(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
test the EchoData interface
|
||||||
|
*/
|
||||||
|
static BOOL test_echodata(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
NTSTATUS status;
|
||||||
|
char *data_in, *data_out;
|
||||||
|
int len = 10;
|
||||||
|
int len_out;
|
||||||
|
|
||||||
|
printf("\nTesting EchoData\n");
|
||||||
|
|
||||||
|
data_in = talloc(mem_ctx, len);
|
||||||
|
for (i=0;i<len;i++) {
|
||||||
|
data_in[i] = i+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = dcerpc_rpcecho_echodata(p, mem_ctx,
|
||||||
|
len,
|
||||||
|
data_in,
|
||||||
|
&len_out,
|
||||||
|
&data_out);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
printf("EchoData(%d) failed\n", len);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
printf("EchoData(%d) returned %d bytes\n", len, len_out);
|
||||||
|
|
||||||
|
if (memcmp(data_in, data_out, len) != 0) {
|
||||||
|
printf("Bad data returned!\n");
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL torture_rpc_echo(int dummy)
|
BOOL torture_rpc_echo(int dummy)
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
@ -63,6 +101,10 @@ BOOL torture_rpc_echo(int dummy)
|
|||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!test_echodata(p, mem_ctx)) {
|
||||||
|
ret = False;
|
||||||
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
torture_rpc_close(p);
|
torture_rpc_close(p);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user