From dc2ffe07a8b25c117c7778fb706274198c11c2cc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 3 Nov 2003 07:26:30 +0000 Subject: started adding RPC-ECHO torture cases (This used to be commit 8cff335dab438aa2dbcca91a717e14ef5a8288dd) --- source4/Makefile.in | 7 ++-- source4/include/includes.h | 1 - source4/libcli/ndr/libndr.h | 4 +++ source4/libcli/ndr/ndr_echo.c | 46 +++++++++++++++++++++++++ source4/libcli/ndr/ndr_echo.h | 45 ++++++++++++++++++++++++ source4/libcli/rpc/dcerpc.c | 21 ++++++------ source4/libcli/rpc/dcerpc.h | 3 ++ source4/libcli/rpc/rpc_echo.c | 79 +++++++++++++++++++++++++++++++++++++++++++ source4/torture/rpc/echo.c | 51 ++++++++++++++++++++++++++++ source4/torture/rpc/lsa.c | 6 ++-- source4/torture/torture.c | 1 + 11 files changed, 245 insertions(+), 19 deletions(-) create mode 100644 source4/libcli/ndr/ndr_echo.c create mode 100644 source4/libcli/ndr/ndr_echo.h create mode 100644 source4/libcli/rpc/rpc_echo.c create mode 100644 source4/torture/rpc/echo.c (limited to 'source4') diff --git a/source4/Makefile.in b/source4/Makefile.in index 5c348733e2..82354713f2 100644 --- a/source4/Makefile.in +++ b/source4/Makefile.in @@ -193,9 +193,10 @@ LIBCLIUTIL_OBJ = libcli/util/asn1.o \ libcli/util/doserr.o libcli/util/errormap.o \ libcli/util/pwd_cache.o libcli/util/clierror.o libcli/util/cliutil.o -LIBRAW_NDR_OBJ = libcli/ndr/ndr.o libcli/ndr/ndr_basic.o libcli/ndr/ndr_sec.o +LIBRAW_NDR_OBJ = libcli/ndr/ndr.o libcli/ndr/ndr_basic.o libcli/ndr/ndr_sec.o \ + libcli/ndr/ndr_echo.o -LIBRAW_RPC_OBJ = libcli/rpc/dcerpc.o +LIBRAW_RPC_OBJ = libcli/rpc/dcerpc.o libcli/rpc/rpc_echo.o LIBRAW_OBJ = libcli/raw/rawfile.o libcli/raw/smb_signing.o \ libcli/raw/clisocket.o libcli/raw/clitransport.o \ @@ -527,7 +528,7 @@ SMBTORTURE_RAW_OBJ = torture/raw/qfsinfo.o torture/raw/qfileinfo.o torture/raw/s torture/raw/chkpath.o torture/raw/unlink.o torture/raw/read.o torture/raw/context.o \ torture/raw/write.o torture/raw/lock.o torture/raw/rename.o torture/raw/seek.o -SMBTORTURE_RPC_OBJ = torture/rpc/lsa.o +SMBTORTURE_RPC_OBJ = torture/rpc/lsa.o torture/rpc/echo.o SMBTORTURE_OBJ1 = torture/torture.o torture/torture_util.o torture/nbio.o torture/scanner.o \ torture/utable.o torture/denytest.o torture/mangle_test.o \ diff --git a/source4/include/includes.h b/source4/include/includes.h index 68bd3b629f..fb8719b2b6 100644 --- a/source4/include/includes.h +++ b/source4/include/includes.h @@ -777,7 +777,6 @@ extern int errno; #include "mutex.h" #include "libcli/ndr/libndr.h" -#include "libcli/ndr/ndr_sec.h" #include "libcli/rpc/dcerpc.h" /* diff --git a/source4/libcli/ndr/libndr.h b/source4/libcli/ndr/libndr.h index 4369ebeb30..d9d18299ab 100644 --- a/source4/libcli/ndr/libndr.h +++ b/source4/libcli/ndr/libndr.h @@ -83,3 +83,7 @@ struct ndr_push { if (!(s)) return NT_STATUS_NO_MEMORY; \ } \ } while (0) + +/* now pull in the individual parsers */ +#include "libcli/ndr/ndr_sec.h" +#include "libcli/ndr/ndr_echo.h" diff --git a/source4/libcli/ndr/ndr_echo.c b/source4/libcli/ndr/ndr_echo.c new file mode 100644 index 0000000000..da4f28f30c --- /dev/null +++ b/source4/libcli/ndr/ndr_echo.c @@ -0,0 +1,46 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling rpcecho pipe + + Copyright (C) Andrew Tridgell 2003 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#include "includes.h" + + +/* + parse a addone +*/ +NTSTATUS ndr_pull_rpcecho_addone(struct ndr_pull *ndr, + struct rpcecho_addone *r) +{ + NDR_CHECK(ndr_pull_u32(ndr, &r->out.data)); + return NT_STATUS_OK; +} + + +/* + push a addone +*/ +NTSTATUS ndr_push_rpcecho_addone(struct ndr_push *ndr, + struct rpcecho_addone *r) +{ + NDR_CHECK(ndr_push_u32(ndr, r->in.data)); + return NT_STATUS_OK; +} diff --git a/source4/libcli/ndr/ndr_echo.h b/source4/libcli/ndr/ndr_echo.h new file mode 100644 index 0000000000..6144d3885b --- /dev/null +++ b/source4/libcli/ndr/ndr_echo.h @@ -0,0 +1,45 @@ +/* + Unix SMB/CIFS implementation. + + definitions for marshalling/unmarshalling the rpcecho pipe + + Copyright (C) Andrew Tridgell 2003 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + see http://samba.org/ftp/unpacked/junkcode/rpcecho-win32/ for the + definition of this pipe +*/ + +/* AddOne interface */ +struct rpcecho_addone { + struct { + int data; + } in; + struct { + int data; + } out; +}; + +/* define the command codes */ +enum { + RPCECHO_CALL_ADDONE=0, + RPCECHO_CALL_ECHODATA, + RPCECHO_CALL_SINKDATA, + RPCECHO_CALL_SOURCEDATA +}; + diff --git a/source4/libcli/rpc/dcerpc.c b/source4/libcli/rpc/dcerpc.c index 0e78e16ed3..3f95bd914c 100644 --- a/source4/libcli/rpc/dcerpc.c +++ b/source4/libcli/rpc/dcerpc.c @@ -573,21 +573,20 @@ NTSTATUS dcerpc_bind(struct dcerpc_pipe *p, return status; } -#define TRANSFER_SYNTAX_V2 {"8a885d04-1ceb-11c9-9fe8-08002b104860", 2} - static const struct { const char *name; struct dcerpc_syntax_id syntax; - struct dcerpc_syntax_id transfer_syntax; + const struct dcerpc_syntax_id transfer_syntax; } known_pipes[] = { - { "lsarpc" , { "12345778-1234-abcd-ef00-0123456789ab", 0 }, TRANSFER_SYNTAX_V2 }, - { "samr" , { "12345778-1234-abcd-ef00-0123456789ac", 1 }, TRANSFER_SYNTAX_V2 }, - { "netlogon", { "12345778-1234-abcd-ef00-01234567cffb", 1 }, TRANSFER_SYNTAX_V2 }, - { "srvsvc" , { "4b324fc8-1670-01d3-1278-5a47bf6ee188", 3 }, TRANSFER_SYNTAX_V2 }, - { "wkssvc" , { "6bffd098-a112-3610-9833-46c3f87e345a", 1 }, TRANSFER_SYNTAX_V2 }, - { "winreg" , { "338cd001-2244-31f1-aaaa-900038001003", 1 }, TRANSFER_SYNTAX_V2 }, - { "spoolss" , { "12345678-1234-abcd-ef00-0123456789ab", 1 }, TRANSFER_SYNTAX_V2 }, - { "netdfs" , { "4fc742e0-4a10-11cf-8273-00aa004ae673", 3 }, TRANSFER_SYNTAX_V2 }, + { "lsarpc" , { "12345778-1234-abcd-ef00-0123456789ab", 0 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "samr" , { "12345778-1234-abcd-ef00-0123456789ac", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "netlogon", { "12345778-1234-abcd-ef00-01234567cffb", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "srvsvc" , { "4b324fc8-1670-01d3-1278-5a47bf6ee188", 3 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "wkssvc" , { "6bffd098-a112-3610-9833-46c3f87e345a", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "winreg" , { "338cd001-2244-31f1-aaaa-900038001003", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "spoolss" , { "12345678-1234-abcd-ef00-0123456789ab", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "netdfs" , { "4fc742e0-4a10-11cf-8273-00aa004ae673", 3 }, DCERPC_TRANSFER_SYNTAX_V2 }, + { "rpcecho" , { "60a15ec5-4de8-11d7-a637-005056a20182", 1 }, DCERPC_TRANSFER_SYNTAX_V2 }, { NULL , } }; diff --git a/source4/libcli/rpc/dcerpc.h b/source4/libcli/rpc/dcerpc.h index cd1bc728e2..7f24f46b91 100644 --- a/source4/libcli/rpc/dcerpc.h +++ b/source4/libcli/rpc/dcerpc.h @@ -122,3 +122,6 @@ struct dcerpc_packet { } out; }; +/* this seems to be the only transfer syntax used */ +#define DCERPC_TRANSFER_SYNTAX_V2 {"8a885d04-1ceb-11c9-9fe8-08002b104860", 2} + diff --git a/source4/libcli/rpc/rpc_echo.c b/source4/libcli/rpc/rpc_echo.c new file mode 100644 index 0000000000..d2b2227823 --- /dev/null +++ b/source4/libcli/rpc/rpc_echo.c @@ -0,0 +1,79 @@ +/* + Unix SMB/CIFS implementation. + + rpc echo pipe calls + + Copyright (C) Andrew Tridgell 2003 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/* + addone interface +*/ +NTSTATUS dcerpc_rpcecho_addone(struct dcerpc_pipe *p, + int in_data, int *out_data) +{ + struct rpcecho_addone r; + NTSTATUS status; + DATA_BLOB request, response; + TALLOC_CTX *mem_ctx; + struct ndr_push *push; + struct ndr_pull *pull; + + mem_ctx = talloc_init("dcerpc_rpcecho_addone"); + if (!mem_ctx) { + return NT_STATUS_NO_MEMORY; + } + + push = ndr_push_init(); + if (!push) { + talloc_destroy(mem_ctx); + return NT_STATUS_NO_MEMORY; + } + + r.in.data = in_data; + + status = ndr_push_rpcecho_addone(push, &r); + if (!NT_STATUS_IS_OK(status)) { + goto failed; + } + + request = ndr_push_blob(push); + + status = cli_dcerpc_request(p, RPCECHO_CALL_ADDONE, mem_ctx, &request, &response); + if (!NT_STATUS_IS_OK(status)) { + goto failed; + } + + pull = ndr_pull_init_blob(&response, mem_ctx); + if (!pull) { + goto failed; + } + + status = ndr_pull_rpcecho_addone(pull, &r); + if (!NT_STATUS_IS_OK(status)) { + goto failed; + } + + *out_data = r.out.data; + +failed: + ndr_push_free(push); + talloc_destroy(mem_ctx); + return status; +} diff --git a/source4/torture/rpc/echo.c b/source4/torture/rpc/echo.c new file mode 100644 index 0000000000..eee192e37a --- /dev/null +++ b/source4/torture/rpc/echo.c @@ -0,0 +1,51 @@ +/* + Unix SMB/CIFS implementation. + test suite for echo rpc operations + + Copyright (C) Andrew Tridgell 2003 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +BOOL torture_rpc_echo(int dummy) +{ + NTSTATUS status; + struct dcerpc_pipe *p; + TALLOC_CTX *mem_ctx; + int i; + + mem_ctx = talloc_init("torture_rpc_echo"); + + status = torture_rpc_connection(&p, "rpcecho"); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + for (i=0;i<10;i++) { + int n; + status = dcerpc_rpcecho_addone(p, i, &n); + if (!NT_STATUS_IS_OK(status)) { + printf("AddOne(%d) failed - %s\n", i, nt_errstr(status)); + goto done; + } + printf("%d + 1 = %d\n", i, n); + } + +done: + torture_rpc_close(p); + return NT_STATUS_IS_OK(status); +} diff --git a/source4/torture/rpc/lsa.c b/source4/torture/rpc/lsa.c index c618685676..cac7f80d5a 100644 --- a/source4/torture/rpc/lsa.c +++ b/source4/torture/rpc/lsa.c @@ -21,9 +21,8 @@ #include "includes.h" -/* Helper function for RPC-OPEN test */ -static DATA_BLOB blob_lsa_open_policy_req(TALLOC_CTX *mem_ctx, BOOL sec_qos, - uint32 des_access) +/* form a lsa open request */ +static DATA_BLOB blob_lsa_open_policy_req(TALLOC_CTX *mem_ctx, BOOL sec_qos, uint32 des_access) { prs_struct qbuf; LSA_Q_OPEN_POL q; @@ -32,7 +31,6 @@ static DATA_BLOB blob_lsa_open_policy_req(TALLOC_CTX *mem_ctx, BOOL sec_qos, ZERO_STRUCT(q); /* Initialise parse structures */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); /* Initialise input parameters */ diff --git a/source4/torture/torture.c b/source4/torture/torture.c index c3f7514e9b..8dc82242a2 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -4026,6 +4026,7 @@ static struct { {"SCAN-ALIASES", torture_trans2_aliases, 0}, {"SCAN-SMB", torture_smb_scan, 0}, {"RPC-LSA", torture_rpc_lsa, 0}, + {"RPC-ECHO", torture_rpc_echo, 0}, {NULL, NULL, 0}}; -- cgit