From 77fb98ac7c38a19c1e810495119f6f5541838d32 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 19 Dec 2003 23:44:26 +0000 Subject: addition of samr_SetSecurity() from kai we needed to adjust the alignment of [relative] buffers for this to work. I wonder if they are always 4 byte aligned? (This used to be commit 9cd0a0b8b976e62c6da71b7e55cba5b38483620d) --- source4/librpc/idl/misc.idl | 2 ++ source4/librpc/idl/samr.idl | 13 +++++++++---- source4/librpc/ndr/ndr.c | 2 +- source4/torture/rpc/samr.c | 17 +++++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) (limited to 'source4') diff --git a/source4/librpc/idl/misc.idl b/source4/librpc/idl/misc.idl index 7b41f45980..fca8fe876e 100644 --- a/source4/librpc/idl/misc.idl +++ b/source4/librpc/idl/misc.idl @@ -28,6 +28,7 @@ interface misc typedef [public] struct { uint8 type; /* xxxx_xxxx_ACE_TYPE - e.g allowed / denied etc */ uint8 flags; /* xxxx_INHERIT_xxxx - e.g OBJECT_INHERIT_ACE */ + [value(ndr_size_security_ace(r))] uint16 size; uint32 access_mask; #if 0 @@ -44,6 +45,7 @@ interface misc typedef [public] struct { uint16 revision; + [value(ndr_size_security_acl(r))] uint16 size; uint32 num_aces; security_ace aces[num_aces]; } security_acl; diff --git a/source4/librpc/idl/samr.idl b/source4/librpc/idl/samr.idl index bbf1e40086..1226d1f770 100644 --- a/source4/librpc/idl/samr.idl +++ b/source4/librpc/idl/samr.idl @@ -31,16 +31,21 @@ /******************/ /* Function: 0x02 */ - NTSTATUS samr_SetSecurity (); - - /******************/ - /* Function: 0x03 */ typedef struct { [value(ndr_size_security_descriptor(r->sd))] uint32 sd_size; [subcontext(4)] security_descriptor *sd; } samr_SdBuf; + NTSTATUS samr_SetSecurity ( + [in,ref] policy_handle *handle, + [in] uint32 sec_info, + [in,ref] samr_SdBuf *sdbuf + ); + + /******************/ + /* Function: 0x03 */ + NTSTATUS samr_QuerySecurity ( [in,ref] policy_handle *handle, [in] uint32 sec_info, diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c index a1e5fe538f..2af63c7676 100644 --- a/source4/librpc/ndr/ndr.c +++ b/source4/librpc/ndr/ndr.c @@ -708,7 +708,7 @@ NTSTATUS ndr_push_relative(struct ndr_push *ndr, int ndr_flags, const void *p, if (ndr->relative_list == NULL) { ndr->relative_list_end = NULL; } - NDR_CHECK(ndr_push_align(ndr, 8)); + NDR_CHECK(ndr_push_align(ndr, 4)); ndr_push_save(ndr, &save); ndr->offset = ofs->offset; NDR_CHECK(ndr_push_uint32(ndr, save.offset - ndr->ofs_list->offset)); diff --git a/source4/torture/rpc/samr.c b/source4/torture/rpc/samr.c index e5e4493480..f77b7ebde4 100644 --- a/source4/torture/rpc/samr.c +++ b/source4/torture/rpc/samr.c @@ -63,6 +63,7 @@ static BOOL test_QuerySecurity(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, { NTSTATUS status; struct samr_QuerySecurity r; + struct samr_SetSecurity s; r.in.handle = handle; r.in.sec_info = 7; @@ -73,6 +74,22 @@ static BOOL test_QuerySecurity(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } + s.in.handle = handle; + s.in.sec_info = 7; + s.in.sdbuf = r.out.sdbuf; + + status = dcerpc_samr_SetSecurity(p, mem_ctx, &s); + if (!NT_STATUS_IS_OK(status)) { + printf("SetSecurity failed - %s\n", nt_errstr(status)); + return False; + } + + status = dcerpc_samr_QuerySecurity(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("QuerySecurity failed - %s\n", nt_errstr(status)); + return False; + } + return True; } -- cgit