[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-311-gf1680ba

Jeremy Allison jra at samba.org
Tue Nov 13 20:52:10 GMT 2007


The branch, v3-2-test has been updated
       via  f1680bada913af4eaf5c0d686983018d6c8b3e5f (commit)
      from  4d3e84a3b3a39d3d2c9b86affa16c8124b1496e5 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit f1680bada913af4eaf5c0d686983018d6c8b3e5f
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 13 12:51:31 2007 -0800

    Remove last pstring from smbd/*.c
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/auth/auth_compat.c |    2 +-
 source/smbd/message.c     |   51 +++++--
 source/smbd/password.c    |   70 ++++++---
 source/smbd/quotas.c      |  365 +++++++++++++++++++++++----------------------
 source/smbd/utmp.c        |   64 +++++---
 5 files changed, 311 insertions(+), 241 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/auth/auth_compat.c b/source/auth/auth_compat.c
index f10585d..ad2686c 100644
--- a/source/auth/auth_compat.c
+++ b/source/auth/auth_compat.c
@@ -92,7 +92,7 @@ check if a username/password pair is ok via the auth subsystem.
 return True if the password is correct, False otherwise
 ****************************************************************************/
 
-bool password_ok(char *smb_name, DATA_BLOB password_blob)
+bool password_ok(const char *smb_name, DATA_BLOB password_blob)
 {
 
 	DATA_BLOB null_password = data_blob_null;
diff --git a/source/smbd/message.c b/source/smbd/message.c
index b044b6f..12a4bc0 100644
--- a/source/smbd/message.c
+++ b/source/smbd/message.c
@@ -38,7 +38,8 @@ static fstring msgto;
 
 static void msg_deliver(void)
 {
-	pstring name;
+	TALLOC_CTX *ctx = talloc_tos();
+	char *name = NULL;
 	int i;
 	int fd;
 	char *msg;
@@ -52,7 +53,10 @@ static void msg_deliver(void)
 	}
 
 	/* put it in a temporary file */
-	slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir());
+	name = talloc_asprintf(ctx, "%s/msg.XXXXXX",tmpdir());
+	if (!name) {
+		return;
+	}
 	fd = smb_mkstemp(name);
 
 	if (fd == -1) {
@@ -63,7 +67,7 @@ static void msg_deliver(void)
 	/*
 	 * Incoming message is in DOS codepage format. Convert to UNIX.
 	 */
-  
+
 	if ((len = (int)convert_string_allocate(NULL,CH_DOS, CH_UNIX, msgbuf, msgpos, (void **)(void *)&msg, True)) < 0 || !msg) {
 		DEBUG(3,("Conversion failed, delivering message in DOS codepage format\n"));
 		for (i = 0; i < msgpos;) {
@@ -95,14 +99,39 @@ static void msg_deliver(void)
 	if (*lp_msg_command()) {
 		fstring alpha_msgfrom;
 		fstring alpha_msgto;
-		pstring s;
-
-		pstrcpy(s,lp_msg_command());
-		pstring_sub(s,"%f",alpha_strcpy(alpha_msgfrom,msgfrom,NULL,sizeof(alpha_msgfrom)));
-		pstring_sub(s,"%t",alpha_strcpy(alpha_msgto,msgto,NULL,sizeof(alpha_msgto)));
-		standard_sub_basic(current_user_info.smb_name,
-				current_user_info.domain, s, sizeof(s));
-		pstring_sub(s,"%s",name);
+		char *s = talloc_strdup(ctx,
+					lp_msg_command());
+
+		if (!s) {
+			return;
+		}
+		s = talloc_string_sub(ctx, s, "%f",
+					alpha_strcpy(alpha_msgfrom,
+						msgfrom,
+						NULL,
+						sizeof(alpha_msgfrom)));
+		if (!s) {
+			return;
+		}
+		s = talloc_string_sub(ctx, s, "%t",
+					alpha_strcpy(alpha_msgto,
+						msgto,
+						NULL,
+						sizeof(alpha_msgto)));
+		if (!s) {
+			return;
+		}
+		s = talloc_sub_basic(ctx,
+				current_user_info.smb_name,
+				current_user_info.domain,
+				s);
+		if (!s) {
+			return;
+		}
+		s = talloc_string_sub(ctx, s, "%s",name);
+		if (!s) {
+			return;
+		}
 		smbrun(s,NULL);
 	}
 
diff --git a/source/smbd/password.c b/source/smbd/password.c
index 995abbf..80b5415 100644
--- a/source/smbd/password.c
+++ b/source/smbd/password.c
@@ -669,46 +669,51 @@ static char *validate_group(char *group, DATA_BLOB password,int snum)
 
 		/*
 		 * As user_ok can recurse doing a getgrent(), we must
-		 * copy the member list into a pstring on the stack before
+		 * copy the member list onto the heap before
 		 * use. Bug pointed out by leon at eatworms.swmed.edu.
 		 */
 
 		if (gptr) {
-			pstring member_list;
+			char *member_list = NULL;
+			size_t list_len = 0;
 			char *member;
-			size_t copied_len = 0;
 			int i;
 
+			for(i = 0; gptr->gr_mem && gptr->gr_mem[i]; i++) {
+				list_len += strlen(gptr->gr_mem[i])+1;
+			}
+			list_len++;
+
+			member_list = SMB_MALLOC(list_len);
+			if (!member_list) {
+				endgrent();
+				return NULL;
+			}
+
 			*member_list = '\0';
 			member = member_list;
 
 			for(i = 0; gptr->gr_mem && gptr->gr_mem[i]; i++) {
 				size_t member_len = strlen(gptr->gr_mem[i])+1;
-				if(copied_len+member_len < sizeof(pstring)) { 
-
-					DEBUG(10,("validate_group: = gr_mem = "
-						  "%s\n", gptr->gr_mem[i]));
-
-					safe_strcpy(member, gptr->gr_mem[i],
-						    sizeof(pstring) -
-						    copied_len - 1);
-					copied_len += member_len;
-					member += copied_len;
-				} else {
-					*member = '\0';
-				}
+
+				DEBUG(10,("validate_group: = gr_mem = "
+					  "%s\n", gptr->gr_mem[i]));
+
+				safe_strcpy(member, gptr->gr_mem[i],
+					list_len - (member-member_list));
+				member += member_len;
 			}
 
 			endgrent();
 
 			member = member_list;
 			while (*member) {
-				static fstring name;
-				fstrcpy(name,member);
-				if (user_ok(name,snum) &&
-				    password_ok(name,password)) {
-					endgrent();
-					return(&name[0]);
+				if (user_ok(member,snum) &&
+				    password_ok(member,password)) {
+					char *name = talloc_strdup(talloc_tos(),
+								member);
+					SAFE_FREE(member_list);
+					return name;
 				}
 
 				DEBUG(10,("validate_group = member = %s\n",
@@ -716,6 +721,8 @@ static char *validate_group(char *group, DATA_BLOB password,int snum)
 
 				member += strlen(member) + 1;
 			}
+
+			SAFE_FREE(member_list);
 		} else {
 			endgrent();
 			return NULL;
@@ -790,11 +797,22 @@ bool authorise_login(int snum, fstring user, DATA_BLOB password,
 
 	/* check the user= fields and the given password */
 	if (!ok && lp_username(snum)) {
+		TALLOC_CTX *ctx = talloc_tos();
 		char *auser;
-		pstring user_list;
-		pstrcpy(user_list,lp_username(snum));
+		char *user_list = talloc_strdup(ctx, lp_username(snum));
+
+		if (!user_list) {
+			goto check_guest;
+		}
 
-		pstring_sub(user_list,"%S",lp_servicename(snum));
+		user_list = talloc_string_sub(ctx,
+				user_list,
+				"%S",
+				lp_servicename(snum));
+
+		if (!user_list) {
+			goto check_guest;
+		}
 
 		for (auser=strtok(user_list,LIST_SEP); auser && !ok;
 		     auser = strtok(NULL,LIST_SEP)) {
@@ -823,6 +841,8 @@ bool authorise_login(int snum, fstring user, DATA_BLOB password,
 		}
 	}
 
+  check_guest:
+
 	/* check for a normal guest connection */
 	if (!ok && GUEST_OK(snum)) {
 		fstring guestname;
diff --git a/source/smbd/quotas.c b/source/smbd/quotas.c
index ac6ad9d..f47e89b 100644
--- a/source/smbd/quotas.c
+++ b/source/smbd/quotas.c
@@ -45,7 +45,7 @@
  * Declare here, define at end: reduces likely "include" interaction problems.
  *	David Lee <T.D.Lee at durham.ac.uk>
  */
-bool disk_quotas_vxfs(const pstring name, char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
+bool disk_quotas_vxfs(const char *name, char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
 
 #endif /* VXFS_QUOTA */
 
@@ -223,17 +223,17 @@ bool disk_quotas(const char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB
 	egrp_id = getegid();
 
 	/* find the block device file */
-  
+
 	if ( sys_stat(path, &S) == -1 )
 		return(False) ;
 
 	devno = S.st_dev ;
-  
+
 	if ((fp = setmntent(MOUNTED,"r")) == NULL)
 		return(False) ;
 
 	found = False ;
-  
+
 	while ((mnt = getmntent(fp))) {
 		if ( sys_stat(mnt->mnt_dir,&S) == -1 )
 			continue ;
@@ -245,7 +245,7 @@ bool disk_quotas(const char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB
 	}
 
 	endmntent(fp) ;
-  
+
 	if (!found)
 		return(False);
 
@@ -308,94 +308,81 @@ try to get the disk space from disk quotas (CRAY VERSION)
 
 bool disk_quotas(const char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
 {
-  struct mntent *mnt;
-  FILE *fd;
-  SMB_STRUCT_STAT sbuf;
-  SMB_DEV_T devno ;
-  static SMB_DEV_T devno_cached = 0 ;
-  static pstring name;
-  struct q_request request ;
-  struct qf_header header ;
-  static int quota_default = 0 ;
-  int found ;
-  
-  if ( sys_stat(path,&sbuf) == -1 )
-    return(False) ;
-  
-  devno = sbuf.st_dev ;
-  
-  if ( devno != devno_cached ) {
-    
-    devno_cached = devno ;
-    
-    if ((fd = setmntent(KMTAB)) == NULL)
-      return(False) ;
-    
-    found = False ;
-    
-    while ((mnt = getmntent(fd)) != NULL) {
-      
-      if ( sys_stat(mnt->mnt_dir,&sbuf) == -1 )
-	continue ;
-      
-      if (sbuf.st_dev == devno) {
-	
-	found = True ;
-	break ;
-	
-      }
-      
-    }
-    
-    pstrcpy(name,mnt->mnt_dir) ;
-    endmntent(fd) ;
-    
-    if ( ! found )
-      return(False) ;
-  }
-  
-  request.qf_magic = QF_MAGIC ;
-  request.qf_entry.id = geteuid() ;
-  
-  if (quotactl(name, Q_GETQUOTA, &request) == -1)
-    return(False) ;
-  
-  if ( ! request.user )
-    return(False) ;
-  
-  if ( request.qf_entry.user_q.f_quota == QFV_DEFAULT ) {
-    
-    if ( ! quota_default ) {
-      
-      if ( quotactl(name, Q_GETHEADER, &header) == -1 )
-	return(False) ;
-      else
-	quota_default = header.user_h.def_fq ;
-    }
-    
-    *dfree = quota_default ;
-    
-  }else if ( request.qf_entry.user_q.f_quota == QFV_PREVENT ) {
-    
-    *dfree = 0 ;
-    
-  }else{
-    
-    *dfree = request.qf_entry.user_q.f_quota ;
-    
-  }
-  
-  *dsize = request.qf_entry.user_q.f_use ;
-  
-  if ( *dfree < *dsize )
-    *dfree = 0 ;
-  else
-    *dfree -= *dsize ;
-  
-  *bsize = 4096 ;  /* Cray blocksize */
-  
-  return(True) ;
-  
+	struct mntent *mnt;
+	FILE *fd;
+	SMB_STRUCT_STAT sbuf;
+	SMB_DEV_T devno ;
+	struct q_request request ;
+	struct qf_header header ;
+	int quota_default = 0 ;
+	bool found = false;
+
+	if (sys_stat(path,&sbuf) == -1) {
+		return false;
+	}
+
+	devno = sbuf.st_dev ;
+
+	if ((fd = setmntent(KMTAB)) == NULL) {
+		return false;
+	}
+
+	while ((mnt = getmntent(fd)) != NULL) {
+		if (sys_stat(mnt->mnt_dir,&sbuf) == -1) {
+			continue;
+		}
+		if (sbuf.st_dev == devno) {
+			found = frue ;
+			break;
+		}
+	}
+
+	name = talloc_strdup(talloc_tos(), mnt->mnt_dir);
+	endmntent(fd);
+	if (!found) {
+		return false;
+	}
+
+	if (!name) {
+		return false;
+	}
+
+	request.qf_magic = QF_MAGIC ;
+	request.qf_entry.id = geteuid() ;
+
+	if (quotactl(name, Q_GETQUOTA, &request) == -1) {
+		return false;
+	}
+
+	if (!request.user) {
+		return False;
+	}
+
+	if (request.qf_entry.user_q.f_quota == QFV_DEFAULT) {
+		if (!quota_default) {
+			if (quotactl(name, Q_GETHEADER, &header) == -1) {
+				return false;
+			} else {
+				quota_default = header.user_h.def_fq;
+			}
+		}
+		*dfree = quota_default;
+	} else if (request.qf_entry.user_q.f_quota == QFV_PREVENT) {
+		*dfree = 0;
+	} else {
+		*dfree = request.qf_entry.user_q.f_quota;
+	}
+
+	*dsize = request.qf_entry.user_q.f_use;
+
+	if (*dfree < *dsize) {
+		*dfree = 0;
+	} else {
+		*dfree -= *dsize;
+	}
+
+	*bsize = 4096 ;  /* Cray blocksize */
+	return true;
 }
 
 
@@ -466,7 +453,7 @@ static int my_xdr_getquota_rslt(XDR *xdrsp, struct getquota_rslt *gqr)
 	return (1);
 }
 
-/* Restricted to SUNOS5 for the moment, I haven`t access to others to test. */ 
+/* Restricted to SUNOS5 for the moment, I haven`t access to others to test. */
 static bool nfs_quotas(char *nfspath, uid_t euser_id, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
 {
 	uid_t uid = euser_id;
@@ -515,11 +502,11 @@ static bool nfs_quotas(char *nfspath, uid_t euser_id, SMB_BIG_UINT *bsize, SMB_B
 		goto out;
 	}
 
-	/* 
+	/*
 	 * quotastat returns 0 if the rpc call fails, 1 if quotas exist, 2 if there is
 	 * no quota set, and 3 if no permission to get the quota.  If 0 or 3 return
 	 * something sensible.
-	 */   
+	 */
 
 	switch ( quotastat ) {
 	case 0:
@@ -587,7 +574,10 @@ try to get the disk space from disk quotas (SunOS & Solaris2 version)
 Quota code by Peter Urbanec (amiga at cse.unsw.edu.au).
 ****************************************************************************/
 
-bool disk_quotas(const char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
+bool disk_quotas(const char *path,
+		SMB_BIG_UINT *bsize,
+		SMB_BIG_UINT *dfree,
+		SMB_BIG_UINT *dsize)
 {
 	uid_t euser_id;
 	int ret;
@@ -595,84 +585,90 @@ bool disk_quotas(const char *path, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB
 #if defined(SUNOS5)
 	struct quotctl command;
 	int file;
-	static struct mnttab mnt;
-	static pstring name;
+	struct mnttab mnt;
 #else /* SunOS4 */
 	struct mntent *mnt;
-	static pstring name;
 #endif
+	char *name = NULL;
 	FILE *fd;
 	SMB_STRUCT_STAT sbuf;
-	SMB_DEV_T devno ;
-	static SMB_DEV_T devno_cached = 0 ;
-	static int found ;
+	SMB_DEV_T devno;
+	bool found = false;
 
 	euser_id = geteuid();
-  
-	if ( sys_stat(path,&sbuf) == -1 )
-		return(False) ;
-  
+
+	if (sys_stat(path,&sbuf) == -1) {
+		return false;
+	}
+
 	devno = sbuf.st_dev ;
 	DEBUG(5,("disk_quotas: looking for path \"%s\" devno=%x\n",
 		path, (unsigned int)devno));
-	if ( devno != devno_cached ) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list