[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-2216-gd765593

Günther Deschner gd at samba.org
Thu Feb 14 11:06:07 GMT 2008


The branch, v3-2-test has been updated
       via  d7655932a7cb436f1ee44e443882e2f06d598aa0 (commit)
       via  e75283178dee42a64ec3963f64652c202f0dbd0b (commit)
       via  369df93875c501af460d87b67bb5e919f7741a69 (commit)
      from  4e3357ac3a1b0adac1744a71f997e3442e0e4209 (commit)

http://gitweb.samba.org/?samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit d7655932a7cb436f1ee44e443882e2f06d598aa0
Author: Günther Deschner <gd at samba.org>
Date:   Thu Feb 14 01:53:00 2008 +0100

    Use pidl for _lsa_EnumPrivsAccount().
    
    Guenther

commit e75283178dee42a64ec3963f64652c202f0dbd0b
Author: Günther Deschner <gd at samba.org>
Date:   Thu Feb 14 01:55:22 2008 +0100

    Re-run make idl.
    
    Guenther

commit 369df93875c501af460d87b67bb5e919f7741a69
Author: Günther Deschner <gd at samba.org>
Date:   Thu Feb 14 01:51:15 2008 +0100

    Fix IDL for lsa_EnumPrivsAccount.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source/librpc/gen_ndr/cli_lsa.c |    6 +---
 source/librpc/gen_ndr/cli_lsa.h |    2 +-
 source/librpc/gen_ndr/lsa.h     |    2 +-
 source/librpc/gen_ndr/ndr_lsa.c |   39 ++++++++++++++++++++---------
 source/librpc/gen_ndr/srv_lsa.c |    2 +-
 source/librpc/idl/lsa.idl       |    2 +-
 source/rpc_server/srv_lsa.c     |   24 +-----------------
 source/rpc_server/srv_lsa_nt.c  |   53 ++++++++++++++++++++++++++++----------
 8 files changed, 73 insertions(+), 57 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/librpc/gen_ndr/cli_lsa.c b/source/librpc/gen_ndr/cli_lsa.c
index 5b277ca..205faa6 100644
--- a/source/librpc/gen_ndr/cli_lsa.c
+++ b/source/librpc/gen_ndr/cli_lsa.c
@@ -805,7 +805,7 @@ NTSTATUS rpccli_lsa_OpenAccount(struct rpc_pipe_client *cli,
 NTSTATUS rpccli_lsa_EnumPrivsAccount(struct rpc_pipe_client *cli,
 				     TALLOC_CTX *mem_ctx,
 				     struct policy_handle *handle,
-				     struct lsa_PrivilegeSet *privs)
+				     struct lsa_PrivilegeSet **privs)
 {
 	struct lsa_EnumPrivsAccount r;
 	NTSTATUS status;
@@ -837,9 +837,7 @@ NTSTATUS rpccli_lsa_EnumPrivsAccount(struct rpc_pipe_client *cli,
 	}
 
 	/* Return variables */
-	if (privs && r.out.privs) {
-		*privs = *r.out.privs;
-	}
+	*privs = *r.out.privs;
 
 	/* Return result */
 	return r.out.result;
diff --git a/source/librpc/gen_ndr/cli_lsa.h b/source/librpc/gen_ndr/cli_lsa.h
index 3e1a844..67aafe3 100644
--- a/source/librpc/gen_ndr/cli_lsa.h
+++ b/source/librpc/gen_ndr/cli_lsa.h
@@ -99,7 +99,7 @@ NTSTATUS rpccli_lsa_OpenAccount(struct rpc_pipe_client *cli,
 NTSTATUS rpccli_lsa_EnumPrivsAccount(struct rpc_pipe_client *cli,
 				     TALLOC_CTX *mem_ctx,
 				     struct policy_handle *handle,
-				     struct lsa_PrivilegeSet *privs);
+				     struct lsa_PrivilegeSet **privs);
 NTSTATUS rpccli_lsa_AddPrivilegesToAccount(struct rpc_pipe_client *cli,
 					   TALLOC_CTX *mem_ctx,
 					   struct policy_handle *handle,
diff --git a/source/librpc/gen_ndr/lsa.h b/source/librpc/gen_ndr/lsa.h
index 14d46a6..a948f6d 100644
--- a/source/librpc/gen_ndr/lsa.h
+++ b/source/librpc/gen_ndr/lsa.h
@@ -838,7 +838,7 @@ struct lsa_EnumPrivsAccount {
 	} in;
 
 	struct {
-		struct lsa_PrivilegeSet *privs;/* [unique] */
+		struct lsa_PrivilegeSet **privs;/* [ref] */
 		NTSTATUS result;
 	} out;
 
diff --git a/source/librpc/gen_ndr/ndr_lsa.c b/source/librpc/gen_ndr/ndr_lsa.c
index 84f9974..12544b1 100644
--- a/source/librpc/gen_ndr/ndr_lsa.c
+++ b/source/librpc/gen_ndr/ndr_lsa.c
@@ -6224,9 +6224,12 @@ static enum ndr_err_code ndr_push_lsa_EnumPrivsAccount(struct ndr_push *ndr, int
 		NDR_CHECK(ndr_push_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
 	}
 	if (flags & NDR_OUT) {
-		NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.privs));
-		if (r->out.privs) {
-			NDR_CHECK(ndr_push_lsa_PrivilegeSet(ndr, NDR_SCALARS, r->out.privs));
+		if (r->out.privs == NULL) {
+			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+		}
+		NDR_CHECK(ndr_push_unique_ptr(ndr, *r->out.privs));
+		if (*r->out.privs) {
+			NDR_CHECK(ndr_push_lsa_PrivilegeSet(ndr, NDR_SCALARS, *r->out.privs));
 		}
 		NDR_CHECK(ndr_push_NTSTATUS(ndr, NDR_SCALARS, r->out.result));
 	}
@@ -6238,6 +6241,7 @@ static enum ndr_err_code ndr_pull_lsa_EnumPrivsAccount(struct ndr_pull *ndr, int
 	uint32_t _ptr_privs;
 	TALLOC_CTX *_mem_save_handle_0;
 	TALLOC_CTX *_mem_save_privs_0;
+	TALLOC_CTX *_mem_save_privs_1;
 	if (flags & NDR_IN) {
 		ZERO_STRUCT(r->out);
 
@@ -6248,20 +6252,28 @@ static enum ndr_err_code ndr_pull_lsa_EnumPrivsAccount(struct ndr_pull *ndr, int
 		NDR_PULL_SET_MEM_CTX(ndr, r->in.handle, LIBNDR_FLAG_REF_ALLOC);
 		NDR_CHECK(ndr_pull_policy_handle(ndr, NDR_SCALARS|NDR_BUFFERS, r->in.handle));
 		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_handle_0, LIBNDR_FLAG_REF_ALLOC);
+		NDR_PULL_ALLOC(ndr, r->out.privs);
+		ZERO_STRUCTP(r->out.privs);
 	}
 	if (flags & NDR_OUT) {
+		if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+			NDR_PULL_ALLOC(ndr, r->out.privs);
+		}
+		_mem_save_privs_0 = NDR_PULL_GET_MEM_CTX(ndr);
+		NDR_PULL_SET_MEM_CTX(ndr, r->out.privs, LIBNDR_FLAG_REF_ALLOC);
 		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_privs));
 		if (_ptr_privs) {
-			NDR_PULL_ALLOC(ndr, r->out.privs);
+			NDR_PULL_ALLOC(ndr, *r->out.privs);
 		} else {
-			r->out.privs = NULL;
+			*r->out.privs = NULL;
 		}
-		if (r->out.privs) {
-			_mem_save_privs_0 = NDR_PULL_GET_MEM_CTX(ndr);
-			NDR_PULL_SET_MEM_CTX(ndr, r->out.privs, 0);
-			NDR_CHECK(ndr_pull_lsa_PrivilegeSet(ndr, NDR_SCALARS, r->out.privs));
-			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_privs_0, 0);
+		if (*r->out.privs) {
+			_mem_save_privs_1 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, *r->out.privs, 0);
+			NDR_CHECK(ndr_pull_lsa_PrivilegeSet(ndr, NDR_SCALARS, *r->out.privs));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_privs_1, 0);
 		}
+		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_privs_0, LIBNDR_FLAG_REF_ALLOC);
 		NDR_CHECK(ndr_pull_NTSTATUS(ndr, NDR_SCALARS, &r->out.result));
 	}
 	return NDR_ERR_SUCCESS;
@@ -6288,10 +6300,13 @@ _PUBLIC_ void ndr_print_lsa_EnumPrivsAccount(struct ndr_print *ndr, const char *
 		ndr->depth++;
 		ndr_print_ptr(ndr, "privs", r->out.privs);
 		ndr->depth++;
-		if (r->out.privs) {
-			ndr_print_lsa_PrivilegeSet(ndr, "privs", r->out.privs);
+		ndr_print_ptr(ndr, "privs", *r->out.privs);
+		ndr->depth++;
+		if (*r->out.privs) {
+			ndr_print_lsa_PrivilegeSet(ndr, "privs", *r->out.privs);
 		}
 		ndr->depth--;
+		ndr->depth--;
 		ndr_print_NTSTATUS(ndr, "result", r->out.result);
 		ndr->depth--;
 	}
diff --git a/source/librpc/gen_ndr/srv_lsa.c b/source/librpc/gen_ndr/srv_lsa.c
index b460001..183cd35 100644
--- a/source/librpc/gen_ndr/srv_lsa.c
+++ b/source/librpc/gen_ndr/srv_lsa.c
@@ -1452,7 +1452,7 @@ static bool api_lsa_EnumPrivsAccount(pipes_struct *p)
 	}
 
 	ZERO_STRUCT(r->out);
-	r->out.privs = talloc_zero(r, struct lsa_PrivilegeSet);
+	r->out.privs = talloc_zero(r, struct lsa_PrivilegeSet *);
 	if (r->out.privs == NULL) {
 		talloc_free(r);
 		return false;
diff --git a/source/librpc/idl/lsa.idl b/source/librpc/idl/lsa.idl
index 6eb96a8..390debc 100644
--- a/source/librpc/idl/lsa.idl
+++ b/source/librpc/idl/lsa.idl
@@ -453,7 +453,7 @@ import "security.idl";
 	
 	NTSTATUS lsa_EnumPrivsAccount (
 		[in]         policy_handle *handle,
-		[out,unique] lsa_PrivilegeSet *privs
+		[out,ref] lsa_PrivilegeSet **privs
 		);
 
 
diff --git a/source/rpc_server/srv_lsa.c b/source/rpc_server/srv_lsa.c
index a3fe00c..60a3bd3 100644
--- a/source/rpc_server/srv_lsa.c
+++ b/source/rpc_server/srv_lsa.c
@@ -221,29 +221,7 @@ static bool api_lsa_open_account(pipes_struct *p)
 
 static bool api_lsa_enum_privsaccount(pipes_struct *p)
 {
-	LSA_Q_ENUMPRIVSACCOUNT q_u;
-	LSA_R_ENUMPRIVSACCOUNT r_u;
-	
-	prs_struct *data = &p->in_data.data;
-	prs_struct *rdata = &p->out_data.rdata;
-
-	ZERO_STRUCT(q_u);
-	ZERO_STRUCT(r_u);
-
-	if(!lsa_io_q_enum_privsaccount("", &q_u, data, 0)) {
-		DEBUG(0,("api_lsa_enum_privsaccount: failed to unmarshall LSA_Q_ENUMPRIVSACCOUNT.\n"));
-		return False;
-	}
-
-	r_u.status = _lsa_enum_privsaccount(p, rdata, &q_u, &r_u);
-
-	/* store the response in the SMB stream */
-	if(!lsa_io_r_enum_privsaccount("", &r_u, rdata, 0)) {
-		DEBUG(0,("api_lsa_enum_privsaccount: Failed to marshall LSA_R_ENUMPRIVSACCOUNT.\n"));
-		return False;
-	}
-
-	return True;
+	return proxy_lsa_call(p, NDR_LSA_ENUMPRIVSACCOUNT);
 }
 
 /***************************************************************************
diff --git a/source/rpc_server/srv_lsa_nt.c b/source/rpc_server/srv_lsa_nt.c
index 275f3d9..4e2884c 100644
--- a/source/rpc_server/srv_lsa_nt.c
+++ b/source/rpc_server/srv_lsa_nt.c
@@ -1720,38 +1720,69 @@ NTSTATUS _lsa_OpenAccount(pipes_struct *p,
 }
 
 /***************************************************************************
+ _lsa_EnumPrivsAccount
  For a given SID, enumerate all the privilege this account has.
  ***************************************************************************/
 
-NTSTATUS _lsa_enum_privsaccount(pipes_struct *p, prs_struct *ps, LSA_Q_ENUMPRIVSACCOUNT *q_u, LSA_R_ENUMPRIVSACCOUNT *r_u)
+NTSTATUS _lsa_EnumPrivsAccount(pipes_struct *p,
+			       struct lsa_EnumPrivsAccount *r)
 {
+	NTSTATUS status = NT_STATUS_OK;
 	struct lsa_info *info=NULL;
 	SE_PRIV mask;
 	PRIVILEGE_SET privileges;
+	struct lsa_PrivilegeSet *priv_set = NULL;
+	struct lsa_LUIDAttribute *luid_attrs = NULL;
+	int i;
 
 	/* find the connection policy handle. */
-	if (!find_policy_by_hnd(p, &q_u->pol, (void **)(void *)&info))
+	if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
 		return NT_STATUS_INVALID_HANDLE;
 
-	if ( !get_privileges_for_sids( &mask, &info->sid, 1 ) ) 
+	if ( !get_privileges_for_sids( &mask, &info->sid, 1 ) )
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 
 	privilege_set_init( &privileges );
 
 	if ( se_priv_to_privilege_set( &privileges, &mask ) ) {
 
-		DEBUG(10,("_lsa_enum_privsaccount: %s has %d privileges\n",
+		DEBUG(10,("_lsa_EnumPrivsAccount: %s has %d privileges\n",
 			  sid_string_dbg(&info->sid),
 			  privileges.count));
 
-		r_u->status = init_lsa_r_enum_privsaccount(ps->mem_ctx, r_u, privileges.set, privileges.count, 0);
+		priv_set = TALLOC_ZERO_P(p->mem_ctx, struct lsa_PrivilegeSet);
+		if (!priv_set) {
+			status = NT_STATUS_NO_MEMORY;
+			goto done;
+		}
+
+		luid_attrs = TALLOC_ZERO_ARRAY(p->mem_ctx,
+					       struct lsa_LUIDAttribute,
+					       privileges.count);
+		if (!luid_attrs) {
+			status = NT_STATUS_NO_MEMORY;
+			goto done;
+		}
+
+		for (i=0; i<privileges.count; i++) {
+			luid_attrs[i].luid.low = privileges.set[i].luid.low;
+			luid_attrs[i].luid.high = privileges.set[i].luid.high;
+			luid_attrs[i].attribute = privileges.set[i].attr;
+		}
+
+		priv_set->count = privileges.count;
+		priv_set->unknown = 0;
+		priv_set->set = luid_attrs;
+
+		*r->out.privs = priv_set;
+	} else {
+		status = NT_STATUS_NO_SUCH_PRIVILEGE;
 	}
-	else
-		r_u->status = NT_STATUS_NO_SUCH_PRIVILEGE;
 
+ done:
 	privilege_set_free( &privileges );
 
-	return r_u->status;
+	return status;
 }
 
 /***************************************************************************
@@ -2246,12 +2277,6 @@ NTSTATUS _lsa_LookupSids(pipes_struct *p, struct lsa_LookupSids *r)
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS _lsa_EnumPrivsAccount(pipes_struct *p, struct lsa_EnumPrivsAccount *r)
-{
-	p->rng_fault_state = True;
-	return NT_STATUS_NOT_IMPLEMENTED;
-}
-
 NTSTATUS _lsa_AddPrivilegesToAccount(pipes_struct *p, struct lsa_AddPrivilegesToAccount *r)
 {
 	p->rng_fault_state = True;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list