svn commit: samba r14257 - in trunk/source/passdb: .

idra at samba.org idra at samba.org
Sun Mar 12 23:09:32 GMT 2006


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?



More information about the samba-cvs mailing list