[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