summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2010-08-26 18:38:59 +1000
committerAndrew Bartlett <abartlet@samba.org>2010-09-11 18:46:05 +1000
commit9abfd8fe3bf4fd3bfae34e7b621369d3f67cf73c (patch)
tree52fc20f47054e78058da719b5909c47b36b14114
parente113af6fb11504a87fd821fb0d77ff855a36e6d5 (diff)
downloadsamba-9abfd8fe3bf4fd3bfae34e7b621369d3f67cf73c.tar.gz
samba-9abfd8fe3bf4fd3bfae34e7b621369d3f67cf73c.tar.bz2
samba-9abfd8fe3bf4fd3bfae34e7b621369d3f67cf73c.zip
s4-privs Add a lookup by index of privilages
Now that privileges are no longer given luid values sequentially, we need another way to look them up for enumeration. Andrew Bartlett Signed-off-by: Andrew Tridgell <tridge@samba.org>
-rw-r--r--source4/libcli/security/privilege.c11
-rw-r--r--source4/rpc_server/lsa/dcesrv_lsa.c6
2 files changed, 14 insertions, 3 deletions
diff --git a/source4/libcli/security/privilege.c b/source4/libcli/security/privilege.c
index c21e1cbb6f..9fd7192883 100644
--- a/source4/libcli/security/privilege.c
+++ b/source4/libcli/security/privilege.c
@@ -235,6 +235,17 @@ enum sec_privilege sec_privilege_from_mask(uint64_t mask)
return -1;
}
+/*
+ map a privilege name to a privilege id. Return -1 if not found
+*/
+enum sec_privilege sec_privilege_from_index(int idx)
+{
+ if (idx >= 0 && idx<ARRAY_SIZE(privilege_names)) {
+ return privilege_names[idx].privilege;
+ }
+ return -1;
+}
+
/*
return a privilege mask given a privilege id
diff --git a/source4/rpc_server/lsa/dcesrv_lsa.c b/source4/rpc_server/lsa/dcesrv_lsa.c
index 51b6339a12..988acda10b 100644
--- a/source4/rpc_server/lsa/dcesrv_lsa.c
+++ b/source4/rpc_server/lsa/dcesrv_lsa.c
@@ -291,6 +291,7 @@ static NTSTATUS dcesrv_lsa_EnumPrivs(struct dcesrv_call_state *dce_call, TALLOC_
struct dcesrv_handle *h;
struct lsa_policy_state *state;
uint32_t i;
+ enum sec_privilege priv;
const char *privname;
DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY);
@@ -298,12 +299,11 @@ static NTSTATUS dcesrv_lsa_EnumPrivs(struct dcesrv_call_state *dce_call, TALLOC_
state = h->data;
i = *r->in.resume_handle;
- if (i == 0) i = 1;
- while ((privname = sec_privilege_name(i)) &&
+ while (((priv = sec_privilege_from_index(i)) != -1) &&
r->out.privs->count < r->in.max_count) {
struct lsa_PrivEntry *e;
-
+ privname = sec_privilege_name(priv);
r->out.privs->privs = talloc_realloc(r->out.privs,
r->out.privs->privs,
struct lsa_PrivEntry,