ndr: make security_ace push manual
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Sun, 31 Dec 2023 04:30:47 +0000 (17:30 +1300)
committerJule Anger <janger@samba.org>
Mon, 12 Feb 2024 10:53:13 +0000 (10:53 +0000)
This will allow some optimisations; in this commit we just copy the
code.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15574
(cherry picked from commit dc08e7924c2e359afeb4b86f306868cad00189a0)

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

index b0237d8b856a0745bdd7a7627c25fabe0179d195..8783b67815764ac473573c8ea6f63d9b439c2a31 100644 (file)
@@ -715,7 +715,7 @@ interface security
                [default][flag(NDR_REMAINING)] DATA_BLOB ignored;
        } security_ace_coda;
 
-       typedef [public,gensize,nosize,nopull] struct {
+       typedef [public,gensize,nosize,nopush,nopull] 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 6ae177f292d5e59dbf113114fde5fc32e7a14f52..b3de2f65f23a93fc82e5ddbe5a08ce52f037e2f2 100644 (file)
@@ -108,6 +108,34 @@ _PUBLIC_ enum ndr_err_code ndr_pull_security_ace(struct ndr_pull *ndr, ndr_flags
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_security_ace(struct ndr_push *ndr, ndr_flags_type ndr_flags, const struct security_ace *r)
+{
+       NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 5));
+               NDR_CHECK(ndr_push_security_ace_type(ndr, NDR_SCALARS, r->type));
+               NDR_CHECK(ndr_push_security_ace_flags(ndr, NDR_SCALARS, r->flags));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, ndr_size_security_ace(r, ndr->flags)));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->access_mask));
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->object, sec_ace_object(r->type)));
+               NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_SCALARS, &r->object));
+               NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, &r->trustee));
+               {
+                       struct ndr_push *_ndr_coda;
+                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_coda, 0, ndr_subcontext_size_of_ace_coda(r, ndr_size_security_ace(r, ndr->flags), ndr->flags)));
+                       NDR_CHECK(ndr_push_set_switch_value(_ndr_coda, &r->coda, r->type));
+                       NDR_CHECK(ndr_push_security_ace_coda(_ndr_coda, NDR_SCALARS|NDR_BUFFERS, &r->coda));
+                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_coda, 0, ndr_subcontext_size_of_ace_coda(r, ndr_size_security_ace(r, ndr->flags), ndr->flags)));
+               }
+               NDR_CHECK(ndr_push_trailer_align(ndr, 5));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+               NDR_CHECK(ndr_push_set_switch_value(ndr, &r->object, sec_ace_object(r->type)));
+               NDR_CHECK(ndr_push_security_ace_object_ctr(ndr, NDR_BUFFERS, &r->object));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
 
 /*
  * An ACE coda can't be bigger than the space allowed for by