Author: metze
Date: 2005-01-10 16:12:41 +0000 (Mon, 10 Jan 2005)
New Revision: 4648

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4648

Log:
fix netr_ServerPasswordSet() bugs

metze

Modified:
   branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c


Changeset:
Modified: branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c     
2005-01-10 15:56:37 UTC (rev 4647)
+++ branches/SAMBA_4_0/source/rpc_server/netlogon/dcerpc_netlogon.c     
2005-01-10 16:12:41 UTC (rev 4648)
@@ -314,19 +314,15 @@
        struct ldb_message **msgs;
        struct ldb_message **msgs_domain;
        NTSTATUS nt_status;
-       struct ldb_message mod, *msg_set_pw = &mod;
-       const char *domain_dn;
+       struct ldb_message *mod;
        const char *domain_sid;
 
        const char *attrs[] = {"objectSid", NULL };
 
        const char **domain_attrs = attrs;
-       ZERO_STRUCT(mod);
 
        nt_status = netr_creds_server_step_check(pipe_state, &r->in.credential, 
&r->out.return_authenticator);
-       if (NT_STATUS_IS_OK(nt_status)) {
-               return nt_status;
-       }
+       NT_STATUS_NOT_OK_RETURN(nt_status);
 
        sam_ctx = samdb_connect(mem_ctx);
        if (sam_ctx == NULL) {
@@ -336,6 +332,9 @@
        num_records = samdb_search(sam_ctx, mem_ctx, NULL, &msgs, attrs,
                                   "(&(sAMAccountName=%s)(objectclass=user))", 
                                   pipe_state->creds->account_name);
+       if (num_records == -1) {
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       }
 
        if (num_records == 0) {
                DEBUG(3,("Couldn't find user [%s] in samdb.\n", 
@@ -360,6 +359,9 @@
                                          &msgs_domain, domain_attrs,
                                          
"(&(objectSid=%s)(objectclass=domain))", 
                                          domain_sid);
+       if (num_records_domain == -1) {
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       }
 
        if (num_records_domain == 0) {
                DEBUG(3,("check_sam_security: Couldn't find domain [%s] in 
passdb file.\n", 
@@ -373,30 +375,25 @@
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
 
-       domain_dn = msgs_domain[0]->dn;
-       
-       mod.dn = talloc_strdup(mem_ctx, msgs[0]->dn);
-       if (!mod.dn) {
-               return NT_STATUS_NO_MEMORY;
-       }
-       
+       mod = talloc_zero(mem_ctx, struct ldb_message);
+       NT_STATUS_HAVE_NO_MEMORY(mod);
+       mod->dn = talloc_reference(mod, msgs[0]->dn);
+    
        creds_des_decrypt(pipe_state->creds, &r->in.new_password);
 
        /* set the password - samdb needs to know both the domain and user DNs,
           so the domain password policy can be used */
-       nt_status = samdb_set_password(sam_ctx, mem_ctx,
-                                      msgs[0]->dn, domain_dn,
-                                      msg_set_pw, 
+       nt_status = samdb_set_password(sam_ctx, mod,
+                                      msgs[0]->dn,
+                                      msgs_domain[0]->dn,
+                                      mod,
                                       NULL, /* Don't have plaintext */
                                       NULL, &r->in.new_password,
                                       False /* This is not considered a 
password change */,
                                       NULL);
-       
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               return nt_status;
-       }
+       NT_STATUS_NOT_OK_RETURN(nt_status);
 
-       ret = samdb_replace(sam_ctx, mem_ctx, msg_set_pw);
+       ret = samdb_replace(sam_ctx, mem_ctx, mod);
        if (ret != 0) {
                /* we really need samdb.c to return NTSTATUS */
                return NT_STATUS_UNSUCCESSFUL;
@@ -651,7 +648,6 @@
        r->out.validation               = r2.out.validation;
        r->out.authoritative            = r2.out.authoritative;
        r->out.flags                    = r2.out.flags;
-       r->out.flags = r2.out.flags;
 
        return nt_status;
 }

Reply via email to