diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/lib/registry/reg_backend_rpc.c | 3 | ||||
-rw-r--r-- | source4/librpc/idl/winreg.idl | 19 | ||||
-rw-r--r-- | source4/torture/config.mk | 4 | ||||
-rw-r--r-- | source4/torture/local/config.mk | 2 | ||||
-rw-r--r-- | source4/torture/local/local.c | 2 | ||||
-rw-r--r-- | source4/torture/local/ndr.c | 212 | ||||
-rw-r--r-- | source4/torture/ndr/ndr.c | 184 | ||||
-rw-r--r-- | source4/torture/ndr/winreg.c | 8 | ||||
-rw-r--r-- | source4/torture/rpc/winreg.c | 3 |
9 files changed, 210 insertions, 227 deletions
diff --git a/source4/lib/registry/reg_backend_rpc.c b/source4/lib/registry/reg_backend_rpc.c index 5e0cf303e0..7e81023acb 100644 --- a/source4/lib/registry/reg_backend_rpc.c +++ b/source4/lib/registry/reg_backend_rpc.c @@ -280,7 +280,8 @@ static WERROR rpc_query_key(const struct registry_key *k) struct rpc_key_data *mykeydata = k->backend_data; TALLOC_CTX *mem_ctx = talloc_init("query_key"); - init_winreg_String(&r.in.class_in, NULL); + r.in.classname = talloc(mem_ctx, struct winreg_String); + init_winreg_String(r.in.classname, NULL); r.in.handle = &mykeydata->pol; status = dcerpc_winreg_QueryInfoKey((struct dcerpc_pipe *)(k->hive->backend_data), mem_ctx, &r); diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl index 30827c73f1..af7e7593d0 100644 --- a/source4/librpc/idl/winreg.idl +++ b/source4/librpc/idl/winreg.idl @@ -148,6 +148,8 @@ import "lsa.idl", "initshutdown.idl", "security.idl"; [size_is(size/2),length_is(length/2),charset(UTF16)] uint16 *name; } winreg_StringBuf; + /******************/ + /* Function: 0x09 */ [public] WERROR winreg_EnumKey( [in,ref] policy_handle *handle, [in] uint32 enum_index, @@ -217,7 +219,7 @@ import "lsa.idl", "initshutdown.idl", "security.idl"; /* Function: 0x10 */ [public] WERROR winreg_QueryInfoKey( [in,ref] policy_handle *handle, - [in,out,ref] winreg_String *class_in, + [in,out,ref] winreg_String *classname, [out,ref] uint32 *num_subkeys, [out,ref] uint32 *max_subkeylen, [out,ref] uint32 *max_subkeysize, @@ -247,11 +249,24 @@ import "lsa.idl", "initshutdown.idl", "security.idl"; /******************/ /* Function: 0x13 */ WERROR winreg_RestoreKey( + [in,ref] policy_handle *handle, + [in,ref] winreg_String *filename, + [in] uint32 flags ); /******************/ /* Function: 0x14 */ + + typedef struct { + uint32 data_size; + KeySecurityData sec_data; + uint8 inherit; + } KeySecurityAttribute; + WERROR winreg_SaveKey( + [in,ref] policy_handle *handle, + [in,ref] winreg_String *filename, + [in,unique] KeySecurityAttribute *sec_attrib ); /******************/ @@ -259,7 +274,7 @@ import "lsa.idl", "initshutdown.idl", "security.idl"; WERROR winreg_SetKeySecurity( [in,ref] policy_handle *handle, [in] winreg_AccessMask access_mask, - [in,out,ref] KeySecurityData *sd + [in,ref] KeySecurityData *sd ); /******************/ diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 990a327f9b..7b1d2d3258 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -96,9 +96,7 @@ PRIVATE_DEPENDENCIES = TORTURE_UTIL include smb2/config.mk -[MODULE::torture_ndr] -SUBSYSTEM = torture -INIT_FUNCTION = torture_ndr_init +[SUBSYSTEM::TORTURE_NDR] PRIVATE_PROTO_HEADER = ndr/proto.h OBJ_FILES = ndr/ndr.o \ ndr/winreg.o \ diff --git a/source4/torture/local/config.mk b/source4/torture/local/config.mk index be06e0141e..1397e8600a 100644 --- a/source4/torture/local/config.mk +++ b/source4/torture/local/config.mk @@ -25,7 +25,6 @@ OBJ_FILES = \ util_strlist.o \ util_file.o \ sddl.o \ - ndr.o \ tdr.o \ event.o \ local.o \ @@ -42,6 +41,7 @@ PUBLIC_DEPENDENCIES = \ POPT_CREDENTIALS \ TORTURE_AUTH \ TORTURE_UTIL +PRIVATE_DEPENDENCIES = TORTURE_NDR # End SUBSYSTEM TORTURE_LOCAL ################################# diff --git a/source4/torture/local/local.c b/source4/torture/local/local.c index 8c050ddd14..c210783028 100644 --- a/source4/torture/local/local.c +++ b/source4/torture/local/local.c @@ -21,6 +21,8 @@ #include "includes.h" #include "torture/torture.h" #include "torture/local/proto.h" +#include "torture/ndr/ndr.h" +#include "torture/ndr/proto.h" #include "torture/auth/proto.h" /* ignore me */ static struct torture_suite * diff --git a/source4/torture/local/ndr.c b/source4/torture/local/ndr.c deleted file mode 100644 index 395fba1905..0000000000 --- a/source4/torture/local/ndr.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - Unix SMB/CIFS implementation. - test suite for basic ndr functions - - Copyright (C) Jelmer Vernooij 2005 - - 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" -#include "torture/torture.h" -#include "librpc/ndr/libndr.h" - -static bool test_check_string_terminator(struct torture_context *tctx) -{ - struct ndr_pull *ndr; - DATA_BLOB blob; - TALLOC_CTX *mem_ctx = tctx; - - /* Simple test */ - blob = strhex_to_data_blob("0000"); - - ndr = ndr_pull_init_blob(&blob, mem_ctx); - - torture_assert_ntstatus_ok(tctx, ndr_check_string_terminator(ndr, 1, 2), - "simple check_string_terminator test failed"); - - torture_assert(tctx, ndr->offset == 0, - "check_string_terminator did not reset offset"); - - if (NT_STATUS_IS_OK(ndr_check_string_terminator(ndr, 1, 3))) { - torture_fail(tctx, "check_string_terminator checked beyond string boundaries"); - } - - torture_assert(tctx, ndr->offset == 0, - "check_string_terminator did not reset offset"); - - talloc_free(ndr); - - blob = strhex_to_data_blob("11220000"); - ndr = ndr_pull_init_blob(&blob, mem_ctx); - - torture_assert_ntstatus_ok(tctx, - ndr_check_string_terminator(ndr, 4, 1), - "check_string_terminator failed to recognize terminator"); - - torture_assert_ntstatus_ok(tctx, - ndr_check_string_terminator(ndr, 3, 1), - "check_string_terminator failed to recognize terminator"); - - if (NT_STATUS_IS_OK(ndr_check_string_terminator(ndr, 2, 1))) { - torture_fail(tctx, - "check_string_terminator erroneously reported terminator"); - } - - torture_assert(tctx, ndr->offset == 0, - "check_string_terminator did not reset offset"); - return true; -} - -static bool test_guid_from_string_valid(struct torture_context *tctx) -{ - /* FIXME */ - return true; -} - -static bool test_guid_from_string_null(struct torture_context *tctx) -{ - struct GUID guid; - torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, - GUID_from_string(NULL, &guid), - "NULL failed"); - return true; -} - -static bool test_guid_from_string_invalid(struct torture_context *tctx) -{ - struct GUID g1; - torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, - GUID_from_string("bla", &g1), - "parameter not invalid"); - return true; -} - -static bool test_guid_from_string(struct torture_context *tctx) -{ - struct GUID g1, exp; - torture_assert_ntstatus_ok(tctx, - GUID_from_string("00000001-0002-0003-0405-060708090a0b", &g1), - "invalid return code"); - exp.time_low = 1; - exp.time_mid = 2; - exp.time_hi_and_version = 3; - exp.clock_seq[0] = 4; - exp.clock_seq[1] = 5; - exp.node[0] = 6; - exp.node[1] = 7; - exp.node[2] = 8; - exp.node[3] = 9; - exp.node[4] = 10; - exp.node[5] = 11; - torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); - torture_assert_ntstatus_ok(tctx, - GUID_from_string("{00000001-0002-0003-0405-060708090a0b}", &g1), - "invalid return code"); - torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); - - return true; -} - -static bool test_guid_string_valid(struct torture_context *tctx) -{ - struct GUID g; - g.time_low = 1; - g.time_mid = 2; - g.time_hi_and_version = 3; - g.clock_seq[0] = 4; - g.clock_seq[1] = 5; - g.node[0] = 6; - g.node[1] = 7; - g.node[2] = 8; - g.node[3] = 9; - g.node[4] = 10; - g.node[5] = 11; - torture_assert_str_equal(tctx, "00000001-0002-0003-0405-060708090a0b", GUID_string(tctx, &g), - "parsing guid failed"); - return true; -} - -static bool test_guid_string2_valid(struct torture_context *tctx) -{ - struct GUID g; - g.time_low = 1; - g.time_mid = 2; - g.time_hi_and_version = 3; - g.clock_seq[0] = 4; - g.clock_seq[1] = 5; - g.node[0] = 6; - g.node[1] = 7; - g.node[2] = 8; - g.node[3] = 9; - g.node[4] = 10; - g.node[5] = 11; - torture_assert_str_equal(tctx, "{00000001-0002-0003-0405-060708090a0b}", GUID_string2(tctx, &g), - "parsing guid failed"); - return true; -} - -static bool test_compare_uuid(struct torture_context *tctx) -{ - struct GUID g1, g2; - ZERO_STRUCT(g1); ZERO_STRUCT(g2); - torture_assert_int_equal(tctx, 0, GUID_compare(&g1, &g2), - "GUIDs not equal"); - g1.time_low = 1; - torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), - "GUID diff invalid"); - - g1.time_low = 10; - torture_assert_int_equal(tctx, 10, GUID_compare(&g1, &g2), - "GUID diff invalid"); - - g1.time_low = 0; - g1.clock_seq[1] = 20; - torture_assert_int_equal(tctx, 20, GUID_compare(&g1, &g2), - "GUID diff invalid"); - return true; -} - - -struct torture_suite *torture_local_ndr(TALLOC_CTX *mem_ctx) -{ - struct torture_suite *suite = torture_suite_create(mem_ctx, "NDR"); - - torture_suite_add_simple_test(suite, "string terminator", - test_check_string_terminator); - - torture_suite_add_simple_test(suite, "guid_from_string_null", - test_guid_from_string_null); - - torture_suite_add_simple_test(suite, "guid_from_string", - test_guid_from_string); - - torture_suite_add_simple_test(suite, "guid_from_string_invalid", - test_guid_from_string_invalid); - - torture_suite_add_simple_test(suite, "guid_string_valid", - test_guid_string_valid); - - torture_suite_add_simple_test(suite, "guid_string2_valid", - test_guid_string2_valid); - - torture_suite_add_simple_test(suite, "guid_from_string_valid", - test_guid_from_string_valid); - - torture_suite_add_simple_test(suite, "compare_uuid", - test_compare_uuid); - - return suite; -} diff --git a/source4/torture/ndr/ndr.c b/source4/torture/ndr/ndr.c index c8c2b05df3..9ca60f651b 100644 --- a/source4/torture/ndr/ndr.c +++ b/source4/torture/ndr/ndr.c @@ -84,7 +84,163 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( return test; } -NTSTATUS torture_ndr_init(void) +static bool test_check_string_terminator(struct torture_context *tctx) +{ + struct ndr_pull *ndr; + DATA_BLOB blob; + TALLOC_CTX *mem_ctx = tctx; + + /* Simple test */ + blob = strhex_to_data_blob("0000"); + + ndr = ndr_pull_init_blob(&blob, mem_ctx); + + torture_assert_ntstatus_ok(tctx, ndr_check_string_terminator(ndr, 1, 2), + "simple check_string_terminator test failed"); + + torture_assert(tctx, ndr->offset == 0, + "check_string_terminator did not reset offset"); + + if (NT_STATUS_IS_OK(ndr_check_string_terminator(ndr, 1, 3))) { + torture_fail(tctx, "check_string_terminator checked beyond string boundaries"); + } + + torture_assert(tctx, ndr->offset == 0, + "check_string_terminator did not reset offset"); + + talloc_free(ndr); + + blob = strhex_to_data_blob("11220000"); + ndr = ndr_pull_init_blob(&blob, mem_ctx); + + torture_assert_ntstatus_ok(tctx, + ndr_check_string_terminator(ndr, 4, 1), + "check_string_terminator failed to recognize terminator"); + + torture_assert_ntstatus_ok(tctx, + ndr_check_string_terminator(ndr, 3, 1), + "check_string_terminator failed to recognize terminator"); + + if (NT_STATUS_IS_OK(ndr_check_string_terminator(ndr, 2, 1))) { + torture_fail(tctx, + "check_string_terminator erroneously reported terminator"); + } + + torture_assert(tctx, ndr->offset == 0, + "check_string_terminator did not reset offset"); + return true; +} + +static bool test_guid_from_string_valid(struct torture_context *tctx) +{ + /* FIXME */ + return true; +} + +static bool test_guid_from_string_null(struct torture_context *tctx) +{ + struct GUID guid; + torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, + GUID_from_string(NULL, &guid), + "NULL failed"); + return true; +} + +static bool test_guid_from_string_invalid(struct torture_context *tctx) +{ + struct GUID g1; + torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER, + GUID_from_string("bla", &g1), + "parameter not invalid"); + return true; +} + +static bool test_guid_from_string(struct torture_context *tctx) +{ + struct GUID g1, exp; + torture_assert_ntstatus_ok(tctx, + GUID_from_string("00000001-0002-0003-0405-060708090a0b", &g1), + "invalid return code"); + exp.time_low = 1; + exp.time_mid = 2; + exp.time_hi_and_version = 3; + exp.clock_seq[0] = 4; + exp.clock_seq[1] = 5; + exp.node[0] = 6; + exp.node[1] = 7; + exp.node[2] = 8; + exp.node[3] = 9; + exp.node[4] = 10; + exp.node[5] = 11; + torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); + torture_assert_ntstatus_ok(tctx, + GUID_from_string("{00000001-0002-0003-0405-060708090a0b}", &g1), + "invalid return code"); + torture_assert(tctx, GUID_equal(&g1, &exp), "UUID parsed incorrectly"); + + return true; +} + +static bool test_guid_string_valid(struct torture_context *tctx) +{ + struct GUID g; + g.time_low = 1; + g.time_mid = 2; + g.time_hi_and_version = 3; + g.clock_seq[0] = 4; + g.clock_seq[1] = 5; + g.node[0] = 6; + g.node[1] = 7; + g.node[2] = 8; + g.node[3] = 9; + g.node[4] = 10; + g.node[5] = 11; + torture_assert_str_equal(tctx, "00000001-0002-0003-0405-060708090a0b", GUID_string(tctx, &g), + "parsing guid failed"); + return true; +} + +static bool test_guid_string2_valid(struct torture_context *tctx) +{ + struct GUID g; + g.time_low = 1; + g.time_mid = 2; + g.time_hi_and_version = 3; + g.clock_seq[0] = 4; + g.clock_seq[1] = 5; + g.node[0] = 6; + g.node[1] = 7; + g.node[2] = 8; + g.node[3] = 9; + g.node[4] = 10; + g.node[5] = 11; + torture_assert_str_equal(tctx, "{00000001-0002-0003-0405-060708090a0b}", GUID_string2(tctx, &g), + "parsing guid failed"); + return true; +} + +static bool test_compare_uuid(struct torture_context *tctx) +{ + struct GUID g1, g2; + ZERO_STRUCT(g1); ZERO_STRUCT(g2); + torture_assert_int_equal(tctx, 0, GUID_compare(&g1, &g2), + "GUIDs not equal"); + g1.time_low = 1; + torture_assert_int_equal(tctx, 1, GUID_compare(&g1, &g2), + "GUID diff invalid"); + + g1.time_low = 10; + torture_assert_int_equal(tctx, 10, GUID_compare(&g1, &g2), + "GUID diff invalid"); + + g1.time_low = 0; + g1.clock_seq[1] = 20; + torture_assert_int_equal(tctx, 20, GUID_compare(&g1, &g2), + "GUID diff invalid"); + return true; +} + +struct torture_suite *torture_local_ndr(void) { struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "NDR"); @@ -94,8 +250,30 @@ NTSTATUS torture_ndr_init(void) torture_suite_add_suite(suite, ndr_epmap_suite(suite)); torture_suite_add_suite(suite, ndr_dfs_suite(suite)); - torture_register_suite(suite); + torture_suite_add_simple_test(suite, "string terminator", + test_check_string_terminator); + + torture_suite_add_simple_test(suite, "guid_from_string_null", + test_guid_from_string_null); + + torture_suite_add_simple_test(suite, "guid_from_string", + test_guid_from_string); + + torture_suite_add_simple_test(suite, "guid_from_string_invalid", + test_guid_from_string_invalid); + + torture_suite_add_simple_test(suite, "guid_string_valid", + test_guid_string_valid); + + torture_suite_add_simple_test(suite, "guid_string2_valid", + test_guid_string2_valid); + + torture_suite_add_simple_test(suite, "guid_from_string_valid", + test_guid_from_string_valid); + + torture_suite_add_simple_test(suite, "compare_uuid", + test_compare_uuid); - return NT_STATUS_OK; + return suite; } diff --git a/source4/torture/ndr/winreg.c b/source4/torture/ndr/winreg.c index 8259a0a45e..b4e19e88ad 100644 --- a/source4/torture/ndr/winreg.c +++ b/source4/torture/ndr/winreg.c @@ -390,7 +390,7 @@ static const uint8_t queryinfokey_in_data[] = { static bool queryinfokey_in_check(struct torture_context *tctx, struct winreg_QueryInfoKey *r) { /* FIXME: Handle */ - torture_assert(tctx, r->in.class_in->name == NULL, "class in"); + torture_assert(tctx, r->in.classname->name == NULL, "class in"); return true; } @@ -403,9 +403,9 @@ static const uint8_t queryinfokey_out_data[] = { static bool queryinfokey_out_check(struct torture_context *tctx, struct winreg_QueryInfoKey *r) { - torture_assert(tctx, r->out.class_in != NULL, "class out"); - torture_assert(tctx, r->out.class_in->name != NULL, "class out name"); - torture_assert_str_equal(tctx, r->out.class_in->name, "", "class out name"); + torture_assert(tctx, r->out.classname != NULL, "class out"); + torture_assert(tctx, r->out.classname->name != NULL, "class out name"); + torture_assert_str_equal(tctx, r->out.classname->name, "", "class out name"); torture_assert_int_equal(tctx, *r->out.num_subkeys, 0, "num subkeys"); torture_assert_int_equal(tctx, *r->out.max_subkeylen, 0, "subkey length"); torture_assert_int_equal(tctx, *r->out.max_subkeysize, 140, "subkey size"); diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c index 2516c35276..6c607c0806 100644 --- a/source4/torture/rpc/winreg.c +++ b/source4/torture/rpc/winreg.c @@ -392,7 +392,8 @@ static BOOL test_QueryInfoKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, r.out.secdescsize = &secdescsize; r.out.last_changed_time = &last_changed_time; - init_winreg_String(&r.in.class_in, class); + r.in.classname = talloc(mem_ctx, struct winreg_String); + init_winreg_String(r.in.classname, class); status = dcerpc_winreg_QueryInfoKey(p, mem_ctx, &r); |