svn commit: lorikeet r70 - in trunk/ntacl-lsm: .

tpot at samba.org tpot at samba.org
Fri Sep 24 12:42:08 GMT 2004


Author: tpot
Date: 2004-09-24 12:42:08 +0000 (Fri, 24 Sep 2004)
New Revision: 70

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=lorikeet&path=/trunk/ntacl-lsm&rev=70&nolog=1

Log:
Parse data appearing on /sys/security/ntacl/nt_token as a lsa_SidArray.

Added:
   trunk/ntacl-lsm/ndr_lsa_pull.c
Modified:
   trunk/ntacl-lsm/Makefile
   trunk/ntacl-lsm/includes.h
   trunk/ntacl-lsm/main.c
   trunk/ntacl-lsm/pidl_glue.c


Changeset:
Modified: trunk/ntacl-lsm/Makefile
===================================================================
--- trunk/ntacl-lsm/Makefile	2004-09-24 07:57:22 UTC (rev 69)
+++ trunk/ntacl-lsm/Makefile	2004-09-24 12:42:08 UTC (rev 70)
@@ -1,7 +1,7 @@
 default:
 	make -C /usr/src/kernel-source-2.6.7 SUBDIRS=$(PWD) modules
 
-pidl-objs := pidl_glue.o ndr.o ndr_misc_pull.o talloc.o
+pidl-objs := pidl_glue.o ndr.o ndr_misc_pull.o ndr_lsa_pull.o talloc.o
 
 obj-m := ntacl.o
 ntacl-objs := main.o $(pidl-objs)

Modified: trunk/ntacl-lsm/includes.h
===================================================================
--- trunk/ntacl-lsm/includes.h	2004-09-24 07:57:22 UTC (rev 69)
+++ trunk/ntacl-lsm/includes.h	2004-09-24 12:42:08 UTC (rev 70)
@@ -214,8 +214,21 @@
 	size_t length;
 } DATA_BLOB;
 
+#define dom_sid2 dom_sid
+
 #include "ndr_misc.h"
 
+struct lsa_SidPtr {
+	struct dom_sid2 *sid;
+};
+
+struct lsa_SidArray {
+	uint32 num_sids;
+	struct lsa_SidPtr *sids;
+};
+
 NTSTATUS ndr_pull_security_descriptor(struct ndr_pull *ndr, int ndr_flags, struct security_descriptor *r);
 
+NTSTATUS ndr_pull_lsa_SidArray(struct ndr_pull *ndr, int ndr_flags, struct lsa_SidArray *r);
 NTSTATUS ndr_pull_dom_sid(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *r);
+NTSTATUS ndr_pull_dom_sid2(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid);

Modified: trunk/ntacl-lsm/main.c
===================================================================
--- trunk/ntacl-lsm/main.c	2004-09-24 07:57:22 UTC (rev 69)
+++ trunk/ntacl-lsm/main.c	2004-09-24 12:42:08 UTC (rev 70)
@@ -143,20 +143,29 @@
 	return sprintf(buffer, "S-1-1-0\n");
 }
 
+static struct lsa_SidArray nttoken;
+spinlock_t nttoken_lock = SPIN_LOCK_UNLOCKED;
+
 ssize_t nttoken_store(struct subsystem *subsys, const char *buffer,
 		      size_t size)
 {
 	struct ndr_pull *ndr = ndr_pull_init((char *)buffer, size);
 	NTSTATUS status;
-	struct dom_sid sid;
 
-	status = ndr_pull_dom_sid(ndr, NDR_SCALARS|NDR_BUFFERS, &sid);
+	/* Parse array of SIDs */
 
-	dbg("returned status %d\n", status);
+	spin_lock(nttoken_lock);
 
+	status = ndr_pull_lsa_SidArray(
+		ndr, NDR_SCALARS|NDR_BUFFERS, &nttoken);
+
+	spin_unlock(nttoken_lock);
+
 	if (status != 0)	
 		return -EINVAL;
 
+	dbg("%d sids stored\n", nttoken.num_sids);
+
 	return size;
 }
 

Added: trunk/ntacl-lsm/ndr_lsa_pull.c
===================================================================
--- trunk/ntacl-lsm/ndr_lsa_pull.c	2004-09-24 07:57:22 UTC (rev 69)
+++ trunk/ntacl-lsm/ndr_lsa_pull.c	2004-09-24 12:42:08 UTC (rev 70)
@@ -0,0 +1,58 @@
+/* parser auto-generated by pidl */
+
+#include "includes.h"
+
+static NTSTATUS ndr_pull_lsa_SidPtr(struct ndr_pull *ndr, int ndr_flags, struct lsa_SidPtr *r)
+{
+	uint32_t _ptr_sid;
+	if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+	NDR_CHECK(ndr_pull_struct_start(ndr));
+	NDR_CHECK(ndr_pull_align(ndr, 4));
+	NDR_CHECK(ndr_pull_ptr(ndr, &_ptr_sid));
+	if (_ptr_sid) {
+		NDR_ALLOC(ndr, r->sid);
+	} else {
+		r->sid = NULL;
+	}
+buffers:
+	if (!(ndr_flags & NDR_BUFFERS)) goto done;
+	if (r->sid) {
+		NDR_CHECK(ndr_pull_dom_sid2(ndr, NDR_SCALARS|NDR_BUFFERS, r->sid));
+	}
+	ndr_pull_struct_end(ndr);
+done:
+	return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_lsa_SidArray(struct ndr_pull *ndr, int ndr_flags, struct lsa_SidArray *r)
+{
+	uint32_t _ptr_sids;
+	if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+	NDR_CHECK(ndr_pull_struct_start(ndr));
+	NDR_CHECK(ndr_pull_align(ndr, 4));
+	NDR_CHECK(ndr_pull_uint32(ndr, &r->num_sids));
+	NDR_CHECK(ndr_pull_ptr(ndr, &_ptr_sids));
+	if (_ptr_sids) {
+		NDR_ALLOC(ndr, r->sids);
+	} else {
+		r->sids = NULL;
+	}
+buffers:
+	if (!(ndr_flags & NDR_BUFFERS)) goto done;
+	if (r->sids) {
+	{
+		uint32_t _array_size;
+		NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
+		if (r->num_sids != _array_size) {
+			return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, r->num_sids);
+		}
+	}
+		NDR_ALLOC_N(ndr, r->sids, MAX(1, r->num_sids));
+	{
+		NDR_CHECK(ndr_pull_array(ndr, NDR_SCALARS|NDR_BUFFERS, (void **)r->sids, sizeof(r->sids[0]), r->num_sids, (ndr_pull_flags_fn_t)ndr_pull_lsa_SidPtr));
+	}
+	}
+	ndr_pull_struct_end(ndr);
+done:
+	return NT_STATUS_OK;
+}

Modified: trunk/ntacl-lsm/pidl_glue.c
===================================================================
--- trunk/ntacl-lsm/pidl_glue.c	2004-09-24 07:57:22 UTC (rev 69)
+++ trunk/ntacl-lsm/pidl_glue.c	2004-09-24 12:42:08 UTC (rev 70)
@@ -91,6 +91,19 @@
 	return NT_STATUS_OK;
 }
 
+/*
+  parse a dom_sid2 - this is a dom_sid but with an extra copy of the num_auths field
+*/
+NTSTATUS ndr_pull_dom_sid2(struct ndr_pull *ndr, int ndr_flags, struct dom_sid *sid)
+{
+	uint32_t num_auths;
+	if (!(ndr_flags & NDR_SCALARS)) {
+		return NT_STATUS_OK;
+	}
+	NDR_CHECK(ndr_pull_uint32(ndr, &num_auths));
+	return ndr_pull_dom_sid(ndr, ndr_flags, sid);
+}
+
 void smb_panic(char *msg)
 {
 	printk(KERN_DEBUG "panic: %s", msg);



More information about the samba-cvs mailing list