summaryrefslogtreecommitdiff
path: root/source4/torture/rpc
diff options
context:
space:
mode:
Diffstat (limited to 'source4/torture/rpc')
-rw-r--r--source4/torture/rpc/lsa.c56
1 files changed, 49 insertions, 7 deletions
diff --git a/source4/torture/rpc/lsa.c b/source4/torture/rpc/lsa.c
index a542cad636..5cf56acd30 100644
--- a/source4/torture/rpc/lsa.c
+++ b/source4/torture/rpc/lsa.c
@@ -22,7 +22,7 @@
#include "includes.h"
/*
- this really shouldn't be here ....
+ these really shouldn't be here ....
*/
static char *lsa_sid_string_talloc(TALLOC_CTX *mem_ctx, struct dom_sid *sid)
{
@@ -53,6 +53,31 @@ static char *lsa_sid_string_talloc(TALLOC_CTX *mem_ctx, struct dom_sid *sid)
return ret;
}
+static int dom_sid_compare(struct dom_sid *sid1, struct dom_sid *sid2)
+{
+ int i;
+
+ if (sid1 == sid2) return 0;
+ if (!sid1) return -1;
+ if (!sid2) return 1;
+
+ /* Compare most likely different rids, first: i.e start at end */
+ if (sid1->num_auths != sid2->num_auths)
+ return sid1->num_auths - sid2->num_auths;
+
+ for (i = sid1->num_auths-1; i >= 0; --i)
+ if (sid1->sub_auths[i] != sid2->sub_auths[i])
+ return sid1->sub_auths[i] - sid2->sub_auths[i];
+
+ if (sid1->sid_rev_num != sid2->sid_rev_num)
+ return sid1->sid_rev_num - sid2->sid_rev_num;
+
+ for (i = 0; i < 6; i++)
+ if (sid1->id_auth[i] != sid2->id_auth[i])
+ return sid1->id_auth[i] - sid2->id_auth[i];
+
+ return 0;
+}
static BOOL test_OpenPolicy(struct dcerpc_pipe *p)
{
@@ -124,24 +149,41 @@ static BOOL test_EnumSids(struct dcerpc_pipe *p,
struct policy_handle *handle)
{
NTSTATUS status;
- struct dom_sid **sids;
- uint32 num_entries = 100;
+ struct lsa_SidArray sids1, sids2;
+ uint32 resume_handle;
int i;
printf("\ntesting EnumSids\n");
- status = dcerpc_lsa_EnumSids(p, mem_ctx, handle, 0, &num_entries, &sids);
+ resume_handle = 0;
+ status = dcerpc_lsa_EnumSids(p, mem_ctx, handle, &resume_handle, 100, &sids1);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumSids failed - %s\n", nt_errstr(status));
return False;
}
- printf("Got %d sids\n", num_entries);
+ printf("Got %d sids resume_handle=%u\n", sids1.num_sids, resume_handle);
- for (i=0;i<num_entries;i++) {
- printf("%s\n", lsa_sid_string_talloc(mem_ctx, sids[i]));
+ for (i=0;i<sids1.num_sids;i++) {
+ printf("%s\n", lsa_sid_string_talloc(mem_ctx, sids1.sids[i].sid));
+ }
+
+ if (sids1.num_sids < 3) {
+ return True;
}
+ printf("trying partial listing (asking for 1 at 2)\n");
+ resume_handle = 2;
+ status = dcerpc_lsa_EnumSids(p, mem_ctx, handle, &resume_handle, 1, &sids2);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("EnumSids failed - %s\n", nt_errstr(status));
+ return False;
+ }
+
+ if (sids2.num_sids != 1) {
+ printf("Returned wrong number of entries (%d)\n", sids2.num_sids);
+ return False;
+ }
return True;
}