static NTSTATUS cmd_echo_data(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { struct dcerpc_binding_handle *b = cli->binding_handle; uint32 size, i; NTSTATUS status; uint8_t *in_data = NULL, *out_data = NULL; if (argc != 2) { printf("Usage: %s num\n", argv[0]); return NT_STATUS_OK; } size = atoi(argv[1]); if ( (in_data = (uint8_t*)SMB_MALLOC(size)) == NULL ) { printf("Failure to allocate buff of %d bytes\n", size); status = NT_STATUS_NO_MEMORY; goto done; } if ( (out_data = (uint8_t*)SMB_MALLOC(size)) == NULL ) { printf("Failure to allocate buff of %d bytes\n", size); status = NT_STATUS_NO_MEMORY; goto done; } for (i = 0; i < size; i++) { in_data[i] = i & 0xff; } status = dcerpc_echo_EchoData(b, mem_ctx, size, in_data, out_data); if (!NT_STATUS_IS_OK(status)) { goto done; } for (i = 0; i < size; i++) { if (in_data[i] != out_data[i]) { printf("mismatch at offset %d, %d != %d\n", i, in_data[i], out_data[i]); status = NT_STATUS_UNSUCCESSFUL; } } done: SAFE_FREE(in_data); SAFE_FREE(out_data); return status; }
/* test the EchoData interface */ static bool test_echodata(struct torture_context *tctx, struct dcerpc_pipe *p) { int i; NTSTATUS status; uint8_t *data_in, *data_out; int len; struct echo_EchoData r; if (torture_setting_bool(tctx, "quick", false) && (p->conn->flags & DCERPC_DEBUG_VALIDATE_BOTH)) { len = 1 + (random() % 500); } else { len = 1 + (random() % 5000); } data_in = talloc_array(tctx, uint8_t, len); data_out = talloc_array(tctx, uint8_t, len); for (i=0;i<len;i++) { data_in[i] = i; } r.in.len = len; r.in.in_data = data_in; status = dcerpc_echo_EchoData(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, talloc_asprintf(tctx, "EchoData(%d) failed\n", len)); data_out = r.out.out_data; for (i=0;i<len;i++) { if (data_in[i] != data_out[i]) { torture_comment(tctx, "Bad data returned for len %d at offset %d\n", len, i); torture_comment(tctx, "in:\n"); dump_data(0, data_in+i, MIN(len-i, 16)); torture_comment(tctx, "out:\n"); dump_data(0, data_out+i, MIN(len-1, 16)); return false; } } return true; }