From: Stefan Metzmacher Date: Fri, 7 Nov 2008 09:49:59 +0000 (+0100) Subject: security.idl: sometimes ACEs have some padding at the end X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3fa176b5552341ed8ccd40786bd4caee39b414df;p=thirdparty%2Fsamba.git security.idl: sometimes ACEs have some padding at the end metze (cherry picked from commit 2dc120377baec2c8b7c9b6fe40d15218588c97fd) --- diff --git a/source/librpc/idl/security.idl b/source/librpc/idl/security.idl index c1dfe272e93..7a5d95feb83 100644 --- a/source/librpc/idl/security.idl +++ b/source/librpc/idl/security.idl @@ -289,7 +289,7 @@ interface security [default]; } security_ace_object_ctr; - typedef [public,gensize,nosize] struct { + typedef [public,nopull,gensize,nosize] struct { security_ace_type type; /* SEC_ACE_TYPE_* */ security_ace_flags flags; /* SEC_ACE_FLAG_* */ [value(ndr_size_security_ace(r,ndr->flags))] uint16 size; diff --git a/source/librpc/ndr/ndr_sec_helper.c b/source/librpc/ndr/ndr_sec_helper.c index 18d343799e5..b3e3b4a196e 100644 --- a/source/librpc/ndr/ndr_sec_helper.c +++ b/source/librpc/ndr/ndr_sec_helper.c @@ -51,6 +51,36 @@ size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags) return ndr_size_dom_sid28(sid, flags); } +enum ndr_err_code ndr_pull_security_ace(struct ndr_pull *ndr, int ndr_flags, struct security_ace *r) +{ + if (ndr_flags & NDR_SCALARS) { + uint32_t start_ofs = ndr->offset; + uint32_t size = 0; + uint32_t pad = 0; + NDR_CHECK(ndr_pull_align(ndr, 4)); + NDR_CHECK(ndr_pull_security_ace_type(ndr, NDR_SCALARS, &r->type)); + NDR_CHECK(ndr_pull_security_ace_flags(ndr, NDR_SCALARS, &r->flags)); + NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->size)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->access_mask)); + NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->object, r->type)); + NDR_CHECK(ndr_pull_security_ace_object_ctr(ndr, NDR_SCALARS, &r->object)); + NDR_CHECK(ndr_pull_dom_sid(ndr, NDR_SCALARS, &r->trustee)); + size = ndr->offset - start_ofs; + if (r->size < size) { + return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, + "ndr_pull_security_ace: r->size %u < size %u", + (unsigned)r->size, size); + } + pad = r->size - size; + NDR_PULL_NEED_BYTES(ndr, pad); + ndr->offset += pad; + } + if (ndr_flags & NDR_BUFFERS) { + NDR_CHECK(ndr_pull_security_ace_object_ctr(ndr, NDR_BUFFERS, &r->object)); + } + return NDR_ERR_SUCCESS; +} + /* return the wire size of a security_ace */