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 {
|
||||
*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;
|
||||
}
|
||||
|
||||
@ -138,3 +150,14 @@ NTSTATUS ndr_push_u32(struct ndr_push *ndr, uint32 v)
|
||||
ndr->offset += 4;
|
||||
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));
|
||||
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;
|
||||
};
|
||||
|
||||
/* EchoData interface */
|
||||
struct rpcecho_echodata {
|
||||
struct {
|
||||
int len;
|
||||
const char *data;
|
||||
} in;
|
||||
struct {
|
||||
int len;
|
||||
char *data;
|
||||
} out;
|
||||
};
|
||||
|
||||
/* define the command codes */
|
||||
enum {
|
||||
RPCECHO_CALL_ADDONE=0,
|
||||
|
@ -52,3 +52,34 @@ NTSTATUS dcerpc_rpcecho_addone(struct dcerpc_pipe *p,
|
||||
talloc_destroy(mem_ctx);
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
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)
|
||||
{
|
||||
NTSTATUS status;
|
||||
@ -63,6 +101,10 @@ BOOL torture_rpc_echo(int dummy)
|
||||
ret = False;
|
||||
}
|
||||
|
||||
if (!test_echodata(p, mem_ctx)) {
|
||||
ret = False;
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
torture_rpc_close(p);
|
||||
|
Loading…
x
Reference in New Issue
Block a user