On Sun, 2007-01-21 at 21:16 -0500, Jamie ffolliott wrote:
> > > > I noticed most of the structures in there are this one:
> > > >         struct passwd                  contains     76 
> > bytes in   6 blocks
> > > > (ref 0)
> > > >             /bin/false                     contains     
> > 11 bytes in   1
> > > > blocks (ref 0)
> > > >             /dev/null                      contains     
> > 10 bytes in   1
> > > > blocks (ref 0)
> > > >             System User                    contains     
> > 12 bytes in   1
> > > > blocks (ref 0)
> > > >             x                              contains      
> > 2 bytes in   1
> > > > blocks (ref 0)
> > > >             IUSR_JUNIPER                   contains     
> > 13 bytes in   1
> > > > blocks (ref 0)
> > > > 
> > > > There's 4689 copies of this, and it seems to increase roughly in 
> > > > proportion to smbd's memory use.  Ie. There were 2xxx 
> > copies ealier 
> > > > today when it was using half the memory.
> > > 
> > > Are all the copies identical?  Can you remind me some details about 
> > > your setup?  What is "IUSR_UNIIPER"?
> 
> Yeah it appears they are all identical, I sent a copy of the pool-usage
> output in the last email if you want to have a look.
> 
> IUSR_JUNIPER is a domain user on "JUNIPER" that executes within the IIS5.0
> webserver and accesses the "web" fileshare on KINGWOOD where samba is
> running.  There's about 60 processes executing as IUSR_JUNIPER, and roughly
> 60 smb connections to kingwood.  Each of those processes run an ihtml
> application server as an ISAPI dll (much like asp or php) which will open
> additional files on the "web" fileshare.
> 
> Kingwood is debian/linux testing, with kernel 2.4.27, samba is a PDC, and
> it's also doing some filesharing for a few win2k clients running IIS
> webservers.
> 
> Juniper is Win2k SP4, and is a member of the domain.
> 
> > > Given this output, I'm presuming we have a call to 
> > talloc_getpwnam() 
> > > that is not talloc_free()'ing the result.
> > 
> > Actually, the call would be getpwnam_alloc().  Anyway, can I 
> > get some more context around that output?  I'm interested in 
> > the parent information, and any other details you can give me.
> 
> If there's any other info you need, let me know.

I think this patch might help.  I've just run the 'make test' on it, so
it's not exactly fully baked, but I think it might fix your issue, by
ensuring we clean this stuff up properly, all the time.

Are you in a position to try some experiments? (no is a perfectly
acceptable answer).

Andrew Bartlett

-- 
Andrew Bartlett                                http://samba.org/~abartlet/
Authentication Developer, Samba Team           http://samba.org
Samba Developer, Red Hat Inc.                  http://redhat.com
Index: lib/util_pw.c
===================================================================
--- lib/util_pw.c	(revision 20942)
+++ lib/util_pw.c	(working copy)
@@ -98,15 +98,11 @@
 		i = rand() % PWNAMCACHE_SIZE;
 
 	if (pwnam_cache[i] != NULL) {
-		TALLOC_FREE(pwnam_cache[i]);
+		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 (struct passwd *)talloc_reference(mem_ctx, pwnam_cache[i]);
 }
 
 struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) 
Index: smbd/password.c
===================================================================
--- smbd/password.c	(revision 20942)
+++ smbd/password.c	(working copy)
@@ -90,15 +90,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);
@@ -107,9 +100,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--;
 }
 
@@ -150,7 +141,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) {
@@ -163,14 +154,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++;
@@ -200,6 +189,10 @@
 		return vuser->vuid;
 	}
 
+	/* use this to keep tabs on all our info from the authentication */
+	vuser->server_info = server_info;
+	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
 	 */
@@ -209,14 +202,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;
 		}
 	}
@@ -244,24 +236,23 @@
 			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;
+				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;
 		}
 	}
 
@@ -277,23 +268,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));
 
Index: smbd/session.c
===================================================================
--- smbd/session.c	(revision 20942)
+++ smbd/session.c	(working copy)
@@ -160,9 +160,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;
Index: auth/auth_util.c
===================================================================
--- auth/auth_util.c	(revision 20942)
+++ auth/auth_util.c	(working copy)
@@ -561,18 +561,19 @@
 	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;
+	talloc_steal(result, sampass);
 	result->unix_name = talloc_strdup(result, pwd->pw_name);
 	result->gid = pwd->pw_gid;
 	result->uid = pwd->pw_uid;

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to