r23365: Try to make Windows Vista join again. On my new test environment, it
authorAndrew Bartlett <abartlet@samba.org>
Wed, 6 Jun 2007 12:51:45 +0000 (12:51 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:53:12 +0000 (14:53 -0500)
wants to check for an existing domain join account, and fails.  This
test shows that we need to return NT_STATUS_NONE_MAPPED when nothing
matches.  (not yet tested if this helps vista).

Andrew Bartlett

source/rpc_server/samr/dcesrv_samr.c
source/torture/rpc/samr.c

index 73b740e466efc01c6c4a75f3b263fc54a2e8044d..4bc03cc647ed51d278139ef4bef31a6d2a73c615 100644 (file)
@@ -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;
 }
 
index c82ecb0abce14c1a2e171588d56056754bc00dca..819a8acd4bb33cb1fe8e11e4cd9fe2510807e164 100644 (file)
@@ -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,