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/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 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 187 insertions(+), 11 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 (limited to 'source4/libcli') 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; +} -- cgit