Author: idra
Date: 2006-03-12 23:09:31 +0000 (Sun, 12 Mar 2006)
New Revision: 14257

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

Log:

commit some fixes to the previous patch as Volker pointed out some flaws.


Modified:
   trunk/source/passdb/pdb_ldap.c


Changeset:
Modified: trunk/source/passdb/pdb_ldap.c
===================================================================
--- trunk/source/passdb/pdb_ldap.c      2006-03-12 22:48:25 UTC (rev 14256)
+++ trunk/source/passdb/pdb_ldap.c      2006-03-12 23:09:31 UTC (rev 14257)
@@ -1365,35 +1365,46 @@
        int count;
        const char ** attr_list;
        int rc;
+       TALLOC_CTX *mem_ctx;
+
+       mem_ctx = talloc_new(user);
+       if (mem_ctx == NULL) {
+               DEBUG(0,("ldapsam_setsampwent: Out of memory!\n"));
+               return NT_STATUS_NO_MEMORY;
+       }
        
-       attr_list = get_userattr_list( user, ldap_state->schema_ver );
-       append_attr(user, &attr_list,
+       attr_list = get_userattr_list(mem_ctx, ldap_state->schema_ver );
+       append_attr(mem_ctx, &attr_list,
                    get_userattr_key2string(ldap_state->schema_ver,
                                            LDAP_ATTR_MOD_TIMESTAMP));
-       append_attr(user, &attr_list, "uidNumber");
-       rc = ldapsam_search_suffix_by_name(ldap_state, user, sname, &result,
+       append_attr(mem_ctx, &attr_list, "uidNumber");
+       rc = ldapsam_search_suffix_by_name(ldap_state, mem_ctx, sname, &result,
                                           attr_list);
-       TALLOC_FREE( attr_list );
 
-       if ( rc != LDAP_SUCCESS ) 
+       if ( rc != LDAP_SUCCESS ) {
+               talloc_free(mem_ctx);
                return NT_STATUS_NO_SUCH_USER;
-       
+       }
+
        count = ldap_count_entries(ldap_state->smbldap_state->ldap_struct, 
result);
        
        if (count < 1) {
                DEBUG(4, ("ldapsam_getsampwnam: Unable to locate user [%s] 
count=%d\n", sname, count));
+               talloc_free(mem_ctx);
                ldap_msgfree(result);
                return NT_STATUS_NO_SUCH_USER;
        } else if (count > 1) {
                DEBUG(1, ("ldapsam_getsampwnam: Duplicate entries for this user 
[%s] Failing. count=%d\n", sname, count));
+               talloc_free(mem_ctx);
                ldap_msgfree(result);
                return NT_STATUS_NO_SUCH_USER;
        }
 
-       entry = ldap_first_entry(ldap_state->smbldap_state->ldap_struct, 
result);
+       entry = ldap_first_entry(priv2ld(ldap_state), result);
        if (entry) {
                if (!init_sam_from_ldap(ldap_state, user, entry)) {
                        DEBUG(1,("ldapsam_getsampwnam: init_sam_from_ldap 
failed for user '%s'!\n", sname));
+                       talloc_free(mem_ctx);
                        ldap_msgfree(result);
                        return NT_STATUS_NO_SUCH_USER;
                }
@@ -1404,6 +1415,8 @@
        } else {
                ldap_msgfree(result);
        }
+
+       talloc_free(mem_ctx);
        return ret;
 }
 
@@ -1753,6 +1766,7 @@
                attr_list = get_userattr_list(mem_ctx, ldap_state->schema_ver);
                rc = ldapsam_search_suffix_by_name(ldap_state, mem_ctx, 
pdb_get_username(newpwd), &result, attr_list );
                if (rc != LDAP_SUCCESS) {
+                       talloc_free(mem_ctx);
                        return NT_STATUS_UNSUCCESSFUL;
                }
                pdb_set_backend_private_data(newpwd, result, NULL,
@@ -1890,35 +1904,34 @@
        const char *dn = NULL;
        char *filter;
 
+       if (!username || !*username) {
+               DEBUG(0, ("ldapsam_add_sam_account: Cannot add user without a 
username!\n"));
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
        mem_ctx = talloc_new(newpwd);
        if (mem_ctx == NULL) {
                DEBUG(0, ("talloc_new failed\n"));
                return NT_STATUS_NO_MEMORY;
        }
 
-       if (!username || !*username) {
-               DEBUG(0, ("ldapsam_add_sam_account: Cannot add user without a 
username!\n"));
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-
        /* free this list after the second search or in case we exit on failure 
*/
        attr_list = get_userattr_list(mem_ctx, ldap_state->schema_ver);
 
        rc = ldapsam_search_suffix_by_name (ldap_state, mem_ctx, username, 
&result, attr_list);
-
        if (rc != LDAP_SUCCESS) {
                talloc_free(mem_ctx);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
+       talloc_autofree_ldapmsg(mem_ctx, result);
+
        if (ldap_count_entries(priv2ld(ldap_state), result) != 0) {
                DEBUG(0,("ldapsam_add_sam_account: User '%s' already in the 
base, with samba attributes\n", 
                         username));
-               ldap_msgfree(result);
                talloc_free(mem_ctx);
                return NT_STATUS_UNSUCCESSFUL;
        }
-       ldap_msgfree(result);
        result = NULL;
 
        if (element_is_set_or_changed(newpwd, PDB_USERSID)) {
@@ -1933,6 +1946,7 @@
                        }
                        ldap_msgfree(result);
                }
+               result = NULL;
        }
 
        /* does the entry already exist but without a samba attributes?

Reply via email to