diff options
-rw-r--r-- | source4/rpc_server/samr/dcesrv_samr.c | 9 | ||||
-rw-r--r-- | source4/torture/rpc/samr.c | 30 |
2 files changed, 35 insertions, 4 deletions
diff --git a/source4/rpc_server/samr/dcesrv_samr.c b/source4/rpc_server/samr/dcesrv_samr.c index 73b740e466..4bc03cc647 100644 --- a/source4/rpc_server/samr/dcesrv_samr.c +++ b/source4/rpc_server/samr/dcesrv_samr.c @@ -1783,7 +1783,7 @@ static NTSTATUS dcesrv_samr_LookupNames(struct dcesrv_call_state *dce_call, TALL { struct dcesrv_handle *h; struct samr_domain_state *d_state; - int i; + int i, num_mapped; NTSTATUS status = NT_STATUS_OK; const char * const attrs[] = { "sAMAccountType", "objectSid", NULL }; int count; @@ -1807,6 +1807,8 @@ static NTSTATUS dcesrv_samr_LookupNames(struct dcesrv_call_state *dce_call, TALL r->out.rids.count = r->in.num_names; r->out.types.count = r->in.num_names; + num_mapped = 0; + for (i=0;i<r->in.num_names;i++) { struct ldb_message **res; struct dom_sid *sid; @@ -1844,9 +1846,12 @@ static NTSTATUS dcesrv_samr_LookupNames(struct dcesrv_call_state *dce_call, TALL r->out.rids.ids[i] = sid->sub_auths[sid->num_auths-1]; r->out.types.ids[i] = rtype; + num_mapped++; } - + if (num_mapped == 0) { + return NT_STATUS_NONE_MAPPED; + } return status; } diff --git a/source4/torture/rpc/samr.c b/source4/torture/rpc/samr.c index c82ecb0abc..819a8acd4b 100644 --- a/source4/torture/rpc/samr.c +++ b/source4/torture/rpc/samr.c @@ -922,17 +922,43 @@ static NTSTATUS test_LookupName(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, status = dcerpc_samr_LookupNames(p, mem_ctx, &n); if (!NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED)) { printf("LookupNames[2] failed - %s\n", nt_errstr(status)); + if (NT_STATUS_IS_OK(status)) { + return NT_STATUS_UNSUCCESSFUL; + } return status; } - init_lsa_String(&sname[1], "xxNONAMExx"); n.in.num_names = 0; status = dcerpc_samr_LookupNames(p, mem_ctx, &n); if (!NT_STATUS_IS_OK(status)) { printf("LookupNames[0] failed - %s\n", nt_errstr(status)); + return status; } - return status; + init_lsa_String(&sname[0], "xxNONAMExx"); + n.in.num_names = 1; + status = dcerpc_samr_LookupNames(p, mem_ctx, &n); + if (!NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) { + printf("LookupNames[1 bad name] failed - %s\n", nt_errstr(status)); + if (NT_STATUS_IS_OK(status)) { + return NT_STATUS_UNSUCCESSFUL; + } + return status; + } + + init_lsa_String(&sname[0], "xxNONAMExx"); + init_lsa_String(&sname[1], "xxNONAME2xx"); + n.in.num_names = 2; + status = dcerpc_samr_LookupNames(p, mem_ctx, &n); + if (!NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) { + printf("LookupNames[2 bad names] failed - %s\n", nt_errstr(status)); + if (NT_STATUS_IS_OK(status)) { + return NT_STATUS_UNSUCCESSFUL; + } + return status; + } + + return NT_STATUS_OK; } static NTSTATUS test_OpenUser_byname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, |