security.idl: sometimes ACEs have some padding at the end
authorStefan Metzmacher <metze@samba.org>
Fri, 7 Nov 2008 09:49:59 +0000 (10:49 +0100)
committerGünther Deschner <gd@samba.org>
Fri, 14 Nov 2008 15:14:10 +0000 (16:14 +0100)
metze
(cherry picked from commit 2dc120377baec2c8b7c9b6fe40d15218588c97fd)

source/librpc/idl/security.idl
source/librpc/ndr/ndr_sec_helper.c

index c1dfe272e939c40479e7377f0459c7c834730ab8..7a5d95feb83a240a2000195b15dd57eab63b15e3 100644 (file)
@@ -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;
index 18d343799e56b3b6f76071e1b526f3d0b8e55b27..b3e3b4a196e0fb8fa6da0f78c9affa41e9e52725 100644 (file)
@@ -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
 */