svn commit: samba r23190 - in branches/SAMBA_3_0_26/source: auth include lib smbd

jerry at samba.org jerry at samba.org
Tue May 29 12:53:42 GMT 2007


Author: jerry
Date: 2007-05-29 12:53:42 +0000 (Tue, 29 May 2007)
New Revision: 23190

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

Log:
svn merge ../SAMBA_3_0 -r22019:22026

This is abartlet's talloc changes to the samu struct stored 
in the server info state.


Modified:
   branches/SAMBA_3_0_26/source/auth/auth_sam.c
   branches/SAMBA_3_0_26/source/auth/auth_util.c
   branches/SAMBA_3_0_26/source/include/smb.h
   branches/SAMBA_3_0_26/source/lib/util_pw.c
   branches/SAMBA_3_0_26/source/smbd/password.c
   branches/SAMBA_3_0_26/source/smbd/session.c


Changeset:
Modified: branches/SAMBA_3_0_26/source/auth/auth_sam.c
===================================================================
--- branches/SAMBA_3_0_26/source/auth/auth_sam.c	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/auth/auth_sam.c	2007-05-29 12:53:42 UTC (rev 23190)
@@ -263,10 +263,10 @@
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	/* Can't use the talloc version here, because the returned struct gets
-	   kept on the server_info */
+	/* the returned struct gets kept on the server_info, by means
+	   of a steal further down */
 
-	if ( !(sampass = samu_new( NULL )) ) {
+	if ( !(sampass = samu_new( mem_ctx )) ) {
 		return NT_STATUS_NO_MEMORY;
 	}
 

Modified: branches/SAMBA_3_0_26/source/auth/auth_util.c
===================================================================
--- branches/SAMBA_3_0_26/source/auth/auth_util.c	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/auth/auth_util.c	2007-05-29 12:53:42 UTC (rev 23190)
@@ -561,19 +561,23 @@
 	DOM_SID unix_group_sid;
 	
 
-	if ( !(pwd = getpwnam_alloc(NULL, pdb_get_username(sampass))) ) {
+	if ( !(result = make_server_info(NULL)) ) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	if ( !(pwd = getpwnam_alloc(result, pdb_get_username(sampass))) ) {
 		DEBUG(1, ("User %s in passdb, but getpwnam() fails!\n",
 			  pdb_get_username(sampass)));
+		TALLOC_FREE(result);
 		return NT_STATUS_NO_SUCH_USER;
 	}
 
-	if ( !(result = make_server_info(NULL)) ) {
-		TALLOC_FREE(pwd);
-		return NT_STATUS_NO_MEMORY;
-	}
-
 	result->sam_account = sampass;
-	result->unix_name = talloc_strdup(result, pwd->pw_name);
+	/* Ensure thaat the sampass will be freed with the result */
+	talloc_steal(result, sampass);
+	result->unix_name = pwd->pw_name;
+	/* Ensure that we keep pwd->pw_name, because we will free pwd below */
+	talloc_steal(result, pwd->pw_name);
 	result->gid = pwd->pw_gid;
 	result->uid = pwd->pw_uid;
 	

Modified: branches/SAMBA_3_0_26/source/include/smb.h
===================================================================
--- branches/SAMBA_3_0_26/source/include/smb.h	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/include/smb.h	2007-05-29 12:53:42 UTC (rev 23190)
@@ -1757,9 +1757,9 @@
 	gid_t gid; /* gid of a validated user */
 
 	userdom_struct user;
-	char *homedir;
-	char *unix_homedir;
-	char *logon_script;
+	const char *homedir;
+	const char *unix_homedir;
+	const char *logon_script;
 	
 	BOOL guest;
 

Modified: branches/SAMBA_3_0_26/source/lib/util_pw.c
===================================================================
--- branches/SAMBA_3_0_26/source/lib/util_pw.c	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/lib/util_pw.c	2007-05-29 12:53:42 UTC (rev 23190)
@@ -74,7 +74,7 @@
 		if ((pwnam_cache[i] != NULL) && 
 		    (strcmp(name, pwnam_cache[i]->pw_name) == 0)) {
 			DEBUG(10, ("Got %s from pwnam_cache\n", name));
-			return (struct passwd *)talloc_reference(mem_ctx, pwnam_cache[i]);
+			return tcopy_passwd(mem_ctx, pwnam_cache[i]);
 		}
 	}
 
@@ -98,15 +98,15 @@
 		i = rand() % PWNAMCACHE_SIZE;
 
 	if (pwnam_cache[i] != NULL) {
-		TALLOC_FREE(pwnam_cache[i]);
+		/* Remove this old cache entry, from the cache.  We
+		 * use talloc_unlink here because we want to be very
+		 * clear which referece we are removing */
+		talloc_unlink(pwnam_cache, pwnam_cache[i]);
 	}
 
 	pwnam_cache[i] = tcopy_passwd(pwnam_cache, temp);
-	if (pwnam_cache[i]!= NULL && mem_ctx != NULL) {
-		return (struct passwd *)talloc_reference(mem_ctx, pwnam_cache[i]);
-	}
 
-	return tcopy_passwd(NULL, pwnam_cache[i]);
+	return tcopy_passwd(mem_ctx, temp);
 }
 
 struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) 

Modified: branches/SAMBA_3_0_26/source/smbd/password.c
===================================================================
--- branches/SAMBA_3_0_26/source/smbd/password.c	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/smbd/password.c	2007-05-29 12:53:42 UTC (rev 23190)
@@ -92,15 +92,8 @@
 	if (vuser == NULL)
 		return;
 	
-	SAFE_FREE(vuser->homedir);
-	SAFE_FREE(vuser->unix_homedir);
-	SAFE_FREE(vuser->logon_script);
-	
 	session_yield(vuser);
-	SAFE_FREE(vuser->session_keystr);
 
-	TALLOC_FREE(vuser->server_info);
-
 	data_blob_free(&vuser->session_key);
 
 	DLIST_REMOVE(validated_users, vuser);
@@ -109,10 +102,7 @@
 	   from the vuid 'owner' of connections */
 	conn_clear_vuid_cache(vuid);
 
-	SAFE_FREE(vuser->groups);
-	TALLOC_FREE(vuser->nt_user_token);
-
-	SAFE_FREE(vuser);
+	TALLOC_FREE(vuser);
 	num_validated_vuids--;
 }
 
@@ -153,7 +143,7 @@
 		  DATA_BLOB session_key, DATA_BLOB response_blob,
 		  const char *smb_name)
 {
-	user_struct *vuser = NULL;
+	user_struct *vuser;
 
 	/* Paranoia check. */
 	if(lp_security() == SEC_SHARE) {
@@ -166,14 +156,12 @@
 		return UID_FIELD_INVALID;
 	}
 
-	if((vuser = SMB_MALLOC_P(user_struct)) == NULL) {
-		DEBUG(0,("Failed to malloc users struct!\n"));
+	if((vuser = talloc_zero(NULL, user_struct)) == NULL) {
+		DEBUG(0,("Failed to talloc users struct!\n"));
 		data_blob_free(&session_key);
 		return UID_FIELD_INVALID;
 	}
 
-	ZERO_STRUCTP(vuser);
-
 	/* Allocate a free vuid. Yes this is a linear search... :-) */
 	while( get_valid_user_struct(next_vuid) != NULL ) {
 		next_vuid++;
@@ -203,6 +191,11 @@
 		return vuser->vuid;
 	}
 
+	/* use this to keep tabs on all our info from the authentication */
+	vuser->server_info = server_info;
+	/* Ensure that the server_info will dissapear with the vuser it is now attached to */
+	talloc_steal(vuser, vuser->server_info);
+
 	/* the next functions should be done by a SID mapping system (SMS) as
 	 * the new real sam db won't have reference to unix uids or gids
 	 */
@@ -212,14 +205,13 @@
 	
 	vuser->n_groups = server_info->n_groups;
 	if (vuser->n_groups) {
-		if (!(vuser->groups = (gid_t *)memdup(server_info->groups,
-						      sizeof(gid_t) *
-						      vuser->n_groups))) {
-			DEBUG(0,("register_vuid: failed to memdup "
+		if (!(vuser->groups = (gid_t *)talloc_memdup(vuser, server_info->groups,
+							     sizeof(gid_t) *
+							     vuser->n_groups))) {
+			DEBUG(0,("register_vuid: failed to talloc_memdup "
 				 "vuser->groups\n"));
 			data_blob_free(&session_key);
-			free(vuser);
-			TALLOC_FREE(server_info);
+			TALLOC_FREE(vuser);
 			return UID_FIELD_INVALID;
 		}
 	}
@@ -247,24 +239,26 @@
 			const char *unix_homedir =
 				pdb_get_unix_homedir(server_info->sam_account);
 			if (unix_homedir) {
-				vuser->unix_homedir =
-					smb_xstrdup(unix_homedir);
+				vuser->unix_homedir = unix_homedir;
 			}
 		} else {
 			struct passwd *passwd =
-				getpwnam_alloc(NULL, vuser->user.unix_name);
+				getpwnam_alloc(vuser, vuser->user.unix_name);
 			if (passwd) {
-				vuser->unix_homedir =
-					smb_xstrdup(passwd->pw_dir);
+				vuser->unix_homedir = passwd->pw_dir;
+				/* Ensure that the unix_homedir now
+				 * belongs to vuser, so it goes away
+				 * with it, not with passwd below: */
+				talloc_steal(vuser, vuser->unix_homedir);
 				TALLOC_FREE(passwd);
 			}
 		}
 		
 		if (homedir) {
-			vuser->homedir = smb_xstrdup(homedir);
+			vuser->homedir = homedir;
 		}
 		if (logon_script) {
-			vuser->logon_script = smb_xstrdup(logon_script);
+			vuser->logon_script = logon_script;
 		}
 	}
 
@@ -280,23 +274,15 @@
 		  vuser->user.full_name));	
 
  	if (server_info->ptok) {
-		vuser->nt_user_token = dup_nt_token(NULL, server_info->ptok);
+		vuser->nt_user_token = dup_nt_token(vuser, server_info->ptok);
 	} else {
 		DEBUG(1, ("server_info does not contain a user_token - "
 			  "cannot continue\n"));
-		TALLOC_FREE(server_info);
+		TALLOC_FREE(vuser);
 		data_blob_free(&session_key);
-		SAFE_FREE(vuser->homedir);
-		SAFE_FREE(vuser->unix_homedir);
-		SAFE_FREE(vuser->logon_script);
-
-		SAFE_FREE(vuser);
 		return UID_FIELD_INVALID;
 	}
 
-	/* use this to keep tabs on all our info from the authentication */
-	vuser->server_info = server_info;
-
 	DEBUG(3,("UNIX uid %d is UNIX user %s, and will be vuid %u\n",
 		 (int)vuser->uid,vuser->user.unix_name, vuser->vuid));
 

Modified: branches/SAMBA_3_0_26/source/smbd/session.c
===================================================================
--- branches/SAMBA_3_0_26/source/smbd/session.c	2007-05-29 12:18:41 UTC (rev 23189)
+++ branches/SAMBA_3_0_26/source/smbd/session.c	2007-05-29 12:53:42 UTC (rev 23190)
@@ -205,9 +205,9 @@
 			       sessionid.id_str, sessionid.id_num);
 	}
 
-	vuser->session_keystr = SMB_STRDUP(keystr);
+	vuser->session_keystr = talloc_strdup(vuser, keystr);
 	if (!vuser->session_keystr) {
-		DEBUG(0, ("session_claim:  strdup() failed for session_keystr\n"));
+		DEBUG(0, ("session_claim:  talloc_strdup() failed for session_keystr\n"));
 		return False;
 	}
 	return True;



More information about the samba-cvs mailing list