diff options
Diffstat (limited to 'source4')
| -rw-r--r-- | source4/torture/config.mk | 2 | ||||
| -rw-r--r-- | source4/torture/rap/rap.c | 1 | ||||
| -rw-r--r-- | source4/torture/rap/rpc.c | 104 | 
3 files changed, 106 insertions, 1 deletions
diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 56bfa9cb4f..3315865cec 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -140,7 +140,7 @@ PRIVATE_DEPENDENCIES = TORTURE_UTIL LIBCLI_SMB  # End SUBSYSTEM TORTURE_RAP  ################################# -TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o +TORTURE_RAP_OBJ_FILES = $(torturesrcdir)/rap/rap.o $(torturesrcdir)/rap/rpc.o  $(eval $(call proto_header_template,$(torturesrcdir)/rap/proto.h,$(TORTURE_RAP_OBJ_FILES:.o=.c))) diff --git a/source4/torture/rap/rap.c b/source4/torture/rap/rap.c index 78fc6a410d..53966afa96 100644 --- a/source4/torture/rap/rap.c +++ b/source4/torture/rap/rap.c @@ -551,6 +551,7 @@ NTSTATUS torture_rap_init(void)  	struct torture_suite *suite_basic = torture_suite_create(suite, "BASIC");  	torture_suite_add_suite(suite, suite_basic); +	torture_suite_add_suite(suite, torture_rap_rpc(suite));  	torture_suite_add_1smb_test(suite_basic, "netserverenum",   				    test_netserverenum); diff --git a/source4/torture/rap/rpc.c b/source4/torture/rap/rpc.c new file mode 100644 index 0000000000..68a106278d --- /dev/null +++ b/source4/torture/rap/rpc.c @@ -0,0 +1,104 @@ +/* +   Unix SMB/CIFS implementation. +   test suite for RAP / DCERPC consistency +   Copyright (C) Guenther Deschner 2010 + +   This program is free software; you can redistribute it and/or modify +   it under the terms of the GNU General Public License as published by +   the Free Software Foundation; either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "libcli/libcli.h" +#include "torture/smbtorture.h" +#include "torture/util.h" +#include "libcli/rap/rap.h" +#include "torture/rap/proto.h" +#include "param/param.h" +#include "torture/rpc/rpc.h" +#include "librpc/gen_ndr/ndr_srvsvc_c.h" + +static bool test_rpc_netservergetinfo(struct torture_context *tctx, +				      struct smbcli_state *cli) +{ +	struct rap_WserverGetInfo r; +	struct dcerpc_pipe *p; +	struct dcerpc_binding_handle *b; +	struct srvsvc_NetSrvGetInfo s; +	union srvsvc_NetSrvInfo info; + +	const char *server_name; + +	torture_assert_ntstatus_ok(tctx, +		torture_rpc_connection(tctx, &p, &ndr_table_srvsvc), +		"failed to open srvsvc"); + +	b = p->binding_handle; + +	s.in.server_unc = NULL; +	s.in.level = 101; +	s.out.info = &info; + +	torture_assert_ntstatus_ok(tctx, +		dcerpc_srvsvc_NetSrvGetInfo_r(b, tctx, &s), +		"srvsvc_NetSrvGetInfo level 101 failed"); +	torture_assert_werr_ok(tctx, s.out.result, +		"srvsvc_NetSrvGetInfo level 101 failed"); + +	r.in.bufsize = 0xffff; +	r.in.level = 0; + +	torture_assert_ntstatus_ok(tctx, +		smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), +		"rap_netservergetinfo level 0 failed"); +	torture_assert_int_equal(tctx, r.out.status, 0, +		"rap_netservergetinfo level 0 failed"); + +	server_name = talloc_strndup(tctx, info.info101->server_name, 16); + +	torture_assert_str_equal(tctx, r.out.info.info0.name, server_name, "server name"); + +	if (torture_setting_bool(tctx, "samba3", false)) { +		torture_skip(tctx, "skipping netservergetinfo level 1 against samba3"); +	} + +	r.in.level = 1; + +	torture_assert_ntstatus_ok(tctx, +		smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), +		"rap_netservergetinfo level 1 failed"); +	torture_assert_int_equal(tctx, r.out.status, 0, +		"rap_netservergetinfo level 1 failed"); + +	torture_assert_str_equal(tctx, r.out.info.info1.name, server_name, "server name"); +	torture_assert_int_equal(tctx, r.out.info.info1.version_major, info.info101->version_major, "version major"); +	torture_assert_int_equal(tctx, r.out.info.info1.version_minor, info.info101->version_minor, "version minor"); +	torture_assert_int_equal(tctx, r.out.info.info1.servertype, info.info101->server_type, "server_type"); +	torture_assert_str_equal(tctx, r.out.info.info1.comment, info.info101->comment, "comment"); + +	talloc_free(p); + +	return true; +} + +struct torture_suite *torture_rap_rpc(TALLOC_CTX *mem_ctx) +{ +	struct torture_suite *suite = torture_suite_create(mem_ctx, "RPC"); + +	torture_suite_add_1smb_test(suite, "netservergetinfo", +				    test_rpc_netservergetinfo); + +	suite->description = talloc_strdup(suite, +					   "RAP / DCERPC consistency tests"); + +	return suite; +}  | 
