Author: metze
Date: 2005-03-30 15:04:19 +0000 (Wed, 30 Mar 2005)
New Revision: 6134

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6134

Log:
add a new type dom_sid28 which is a 28 byte fixed buffer with a dom_sid in it

metze

Modified:
   branches/SAMBA_4_0/source/include/smb_interfaces.h
   branches/SAMBA_4_0/source/librpc/ndr/ndr_sec.c


Changeset:
Modified: branches/SAMBA_4_0/source/include/smb_interfaces.h
===================================================================
--- branches/SAMBA_4_0/source/include/smb_interfaces.h  2005-03-30 13:02:23 UTC 
(rev 6133)
+++ branches/SAMBA_4_0/source/include/smb_interfaces.h  2005-03-30 15:04:19 UTC 
(rev 6134)
@@ -55,7 +55,10 @@
 */
 #define dom_sid2 dom_sid
 
+/* same struct as dom_sid but inside a 28 bytes fixed buffer in NDR */
+#define dom_sid28 dom_sid
 
+
 /*
   this header defines the structures and unions used between the SMB
   parser and the backends.

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_sec.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_sec.c      2005-03-30 13:02:23 UTC 
(rev 6133)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_sec.c      2005-03-30 15:04:19 UTC 
(rev 6134)
@@ -56,8 +56,67 @@
        return ndr_push_dom_sid(ndr, ndr_flags, sid);
 }
 
+/*
+  parse a dom_sid28 - this is a dom_sid in a fixed 28 byte buffer, so we need 
to ensure there are only upto 5 sub_auth
+*/
+NTSTATUS ndr_pull_dom_sid28(struct ndr_pull *ndr, int ndr_flags, struct 
dom_sid *sid)
+{
+       NTSTATUS status;
+       struct ndr_pull *subndr;
 
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NT_STATUS_OK;
+       }
+
+       subndr = talloc_zero(ndr, struct ndr_pull);
+       NT_STATUS_HAVE_NO_MEMORY(subndr);
+
+       subndr->data            = ndr->data + ndr->offset;
+       subndr->data_size       = 28;
+       subndr->offset          = 0;
+
+       NDR_CHECK(ndr_pull_advance(ndr, 28));
+
+       status = ndr_pull_dom_sid(subndr, ndr_flags, sid);
+       if (!NT_STATUS_IS_OK(status)) {
+               /* handle a w2k bug which send random data in the buffer */
+               ZERO_STRUCTP(sid);
+       }
+
+       return NT_STATUS_OK;
+}
+
 /*
+  push a dom_sid28 - this is a dom_sid in a 28 byte fixed buffer
+*/
+NTSTATUS ndr_push_dom_sid28(struct ndr_push *ndr, int ndr_flags, struct 
dom_sid *sid)
+{
+       uint32_t old_offset;
+       uint32_t padding;
+
+       if (!(ndr_flags & NDR_SCALARS)) {
+               return NT_STATUS_OK;
+       }
+
+       if (sid->num_auths > 5) {
+               return ndr_push_error(ndr, NDR_ERR_RANGE, 
+                                     "dom_sid28 allows only upto 5 sub auth 
[%u]", 
+                                     sid->num_auths);
+       }
+
+       old_offset = ndr->offset;
+       NDR_CHECK(ndr_push_dom_sid(ndr, ndr_flags, sid));
+
+       padding = 28 - (ndr->offset - old_offset);
+
+       if (padding > 0) {
+               NDR_CHECK(ndr_push_zero(ndr, padding));
+       }
+
+       return NT_STATUS_OK;
+}
+
+/*
   print a dom_sid
 */
 void ndr_print_dom_sid(struct ndr_print *ndr, const char *name, struct dom_sid 
*sid)
@@ -65,11 +124,16 @@
        ndr->print(ndr, "%-25s: %s", name, dom_sid_string(ndr, sid));
 }
 
-void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, struct 
dom_sid2 *sid)
+void ndr_print_dom_sid2(struct ndr_print *ndr, const char *name, struct 
dom_sid *sid)
 {
        ndr_print_dom_sid(ndr, name, sid);
 }
 
+void ndr_print_dom_sid28(struct ndr_print *ndr, const char *name, struct 
dom_sid *sid)
+{
+       ndr_print_dom_sid(ndr, name, sid);
+}
+
 /*
   return the wire size of a dom_sid
 */

Reply via email to