[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