svn commit: samba r22020 - in branches/SAMBA_3_0/source: auth include lib smbd

abartlet at samba.org abartlet at samba.org
Mon Apr 2 03:46:14 GMT 2007


Author: abartlet
Date: 2007-04-02 03:46:13 +0000 (Mon, 02 Apr 2007)
New Revision: 22020

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

Log:
Make it more clear that both the vuser struct and it's contents are
talloc_free()'ed at the end of a session.

Rework the passwd cache code to use talloc_unlink and
talloc_reference, to more carefully manage the cache.

Andrew Bartlett

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


Changeset:
Modified: branches/SAMBA_3_0/source/auth/auth_sam.c
===================================================================
--- branches/SAMBA_3_0/source/auth/auth_sam.c	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/auth/auth_sam.c	2007-04-02 03:46:13 UTC (rev 22020)
@@ -266,7 +266,7 @@
 	/* Can't use the talloc version here, because the returned struct gets
 	   kept on the server_info */
 
-	if ( !(sampass = samu_new( NULL )) ) {
+	if ( !(sampass = samu_new( mem_ctx )) ) {
 		return NT_STATUS_NO_MEMORY;
 	}
 

Modified: branches/SAMBA_3_0/source/auth/auth_util.c
===================================================================
--- branches/SAMBA_3_0/source/auth/auth_util.c	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/auth/auth_util.c	2007-04-02 03:46:13 UTC (rev 22020)
@@ -561,19 +561,23 @@
 	DOM_SID unix_group_sid;
 	
 
-	if ( !(pwd = getpwnam_alloc(NULL, pdb_get_username(sampass))) ) {
+	if ( !(result = make_server_info(NULL)) ) {
+		TALLOC_FREE(pwd);
+		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)));
 		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/source/include/smb.h
===================================================================
--- branches/SAMBA_3_0/source/include/smb.h	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/include/smb.h	2007-04-02 03:46:13 UTC (rev 22020)
@@ -1737,9 +1737,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/source/lib/util_pw.c
===================================================================
--- branches/SAMBA_3_0/source/lib/util_pw.c	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/lib/util_pw.c	2007-04-02 03:46:13 UTC (rev 22020)
@@ -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]);
+	/* while keeping this in the cache, reference a copy for the caller */
+	return (struct passwd *)talloc_reference(mem_ctx, pwnam_cache[i]);
 }
 
 struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) 

Modified: branches/SAMBA_3_0/source/smbd/password.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/password.c	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/smbd/password.c	2007-04-02 03:46:13 UTC (rev 22020)
@@ -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/source/smbd/session.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/session.c	2007-04-01 13:50:02 UTC (rev 22019)
+++ branches/SAMBA_3_0/source/smbd/session.c	2007-04-02 03:46:13 UTC (rev 22020)
@@ -153,9 +153,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