Example #1
0
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;
}
Example #2
0
/*
  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;
}