/*
* 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@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",
member += strlen(member) + 1;
}
+
+ SAFE_FREE(member_list);
} else {
endgrent();
return NULL;
/* 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)) {
}
}
+ check_guest:
+
/* check for a normal guest connection */
if (!ok && GUEST_OK(snum)) {
fstring guestname;
* Declare here, define at end: reduces likely "include" interaction problems.
* David Lee <T.D.Lee@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 */
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 ;
}
endmntent(fp) ;
-
+
if (!found)
return(False);
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;
}
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;
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:
Quota code by Peter Urbanec (amiga@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;
#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 ) {
- devno_cached = devno ;
#if defined(SUNOS5)
- if ((fd = sys_fopen(MNTTAB, "r")) == NULL)
- return(False) ;
-
- found = False ;
-
- while (getmntent(fd, &mnt) == 0) {
- if (sys_stat(mnt.mnt_mountp, &sbuf) == -1)
- continue;
-
- DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n",
- mnt.mnt_mountp, (unsigned int)devno));
-
- /* quotas are only on vxfs, UFS or NFS */
- if ( (sbuf.st_dev == devno) && (
- strcmp( mnt.mnt_fstype, MNTTYPE_UFS ) == 0 ||
- strcmp( mnt.mnt_fstype, "nfs" ) == 0 ||
- strcmp( mnt.mnt_fstype, "vxfs" ) == 0 )) {
- found = True ;
- break;
- }
+ if ((fd = sys_fopen(MNTTAB, "r")) == NULL) {
+ return false;
+ }
+
+ while (getmntent(fd, &mnt) == 0) {
+ if (sys_stat(mnt.mnt_mountp, &sbuf) == -1) {
+ continue;
}
-
- pstrcpy(name,mnt.mnt_mountp) ;
- pstrcat(name,"/quotas") ;
- fclose(fd) ;
-#else /* SunOS4 */
- if ((fd = setmntent(MOUNTED, "r")) == NULL)
- return(False) ;
-
- found = False ;
- while ((mnt = getmntent(fd)) != NULL) {
- if ( sys_stat(mnt->mnt_dir,&sbuf) == -1 )
- continue ;
- DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n", mnt->mnt_dir,(unsigned int)sbuf.st_dev));
- if (sbuf.st_dev == devno) {
- found = True ;
+
+ DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n",
+ mnt.mnt_mountp, (unsigned int)devno));
+
+ /* quotas are only on vxfs, UFS or NFS */
+ if ((sbuf.st_dev == devno) && (
+ strcmp( mnt.mnt_fstype, MNTTYPE_UFS ) == 0 ||
+ strcmp( mnt.mnt_fstype, "nfs" ) == 0 ||
+ strcmp( mnt.mnt_fstype, "vxfs" ) == 0 )) {
+ found = true;
+ name = talloc_asprintf(talloc_tos(),
+ "%s/quotas",
+ mnt.mnt_mountp);
break;
- }
}
-
- pstrcpy(name,mnt->mnt_fsname) ;
- endmntent(fd) ;
-#endif
}
- if ( ! found )
- return(False) ;
+ fclose(fd);
+#else /* SunOS4 */
+ if ((fd = setmntent(MOUNTED, "r")) == NULL) {
+ return false;
+ }
+
+ while ((mnt = getmntent(fd)) != NULL) {
+ if (sys_stat(mnt->mnt_dir,&sbuf) == -1) {
+ continue;
+ }
+ DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n",
+ mnt->mnt_dir,
+ (unsigned int)sbuf.st_dev));
+ if (sbuf.st_dev == devno) {
+ found = true;
+ name = talloc_strdup(talloc_tos(),
+ mnt->mnt_fsname);
+ break;
+ }
+ }
+ endmntent(fd);
+#endif
+ if (!found) {
+ return false;
+ }
+
+ if (!name) {
+ return false;
+ }
become_root();
#if defined(SUNOS5)
- if ( strcmp( mnt.mnt_fstype, "nfs" ) == 0) {
+ if (strcmp(mnt.mnt_fstype, "nfs") == 0) {
bool retval;
- DEBUG(5,("disk_quotas: looking for mountpath (NFS) \"%s\"\n", mnt.mnt_special));
- retval = nfs_quotas(mnt.mnt_special, euser_id, bsize, dfree, dsize);
+ DEBUG(5,("disk_quotas: looking for mountpath (NFS) \"%s\"\n",
+ mnt.mnt_special));
+ retval = nfs_quotas(mnt.mnt_special,
+ euser_id, bsize, dfree, dsize);
unbecome_root();
return retval;
}
DEBUG(5,("disk_quotas: looking for quotas file \"%s\"\n", name));
if((file=sys_open(name, O_RDONLY,0))<0) {
unbecome_root();
- return(False);
+ return false;
}
command.op = Q_GETQUOTA;
command.uid = euser_id;
unbecome_root();
if (ret < 0) {
- DEBUG(5,("disk_quotas ioctl (Solaris) failed. Error = %s\n", strerror(errno) ));
+ DEBUG(5,("disk_quotas ioctl (Solaris) failed. Error = %s\n",
+ strerror(errno) ));
#if defined(SUNOS5) && defined(VXFS_QUOTA)
/* If normal quotactl() fails, try vxfs private calls */
DEBUG(5,("disk_quotas: mount type \"%s\"\n", mnt.mnt_fstype));
if ( 0 == strcmp ( mnt.mnt_fstype, "vxfs" )) {
bool retval;
- retval = disk_quotas_vxfs(name, path, bsize, dfree, dsize);
- return(retval);
+ retval = disk_quotas_vxfs(name, path,
+ bsize, dfree, dsize);
+ return retval;
}
#else
- return(False);
+ return false;
#endif
}
/* If softlimit is zero, set it equal to hardlimit.
*/
-
- if (D.dqb_bsoftlimit==0)
+
+ if (D.dqb_bsoftlimit==0) {
D.dqb_bsoftlimit = D.dqb_bhardlimit;
+ }
- /* Use softlimit to determine disk space. A user exceeding the quota is told
- * that there's no space left. Writes might actually work for a bit if the
- * hardlimit is set higher than softlimit. Effectively the disk becomes
- * made of rubber latex and begins to expand to accommodate the user :-)
+ /* Use softlimit to determine disk space. A user exceeding the quota
+ * is told that there's no space left. Writes might actually work for
+ * a bit if the hardlimit is set higher than softlimit. Effectively
+ * the disk becomes made of rubber latex and begins to expand to
+ * accommodate the user :-)
*/
if (D.dqb_bsoftlimit==0)
if (D.dqb_curblocks > D.dqb_bsoftlimit) {
*dfree = 0;
*dsize = D.dqb_curblocks;
- } else
+ } else {
*dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
-
- DEBUG(5,("disk_quotas for path \"%s\" returning bsize %.0f, dfree %.0f, dsize %.0f\n",
+ }
+
+ DEBUG(5,("disk_quotas for path \"%s\" returning "
+ "bsize %.0f, dfree %.0f, dsize %.0f\n",
path,(double)*bsize,(double)*dfree,(double)*dsize));
- return(True);
+ return true;
}
#include <sys/fs/vx_aioctl.h>
#include <sys/fs/vx_ioctl.h>
-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)
{
uid_t user_id, euser_id;
int ret;
struct vx_dqblk D;
struct vx_quotctl quotabuf;
struct vx_genioctl genbuf;
- pstring qfname;
+ char *qfname;
int file;
/*
* it might be easier to examine and adjust it here.
* Fortunately, VxFS seems not to mind at present.
*/
- pstrcpy(qfname, name) ;
+ qfname = talloc_strdup(talloc_tos(), name);
+ if (!qfname) {
+ return false;
+ }
/* pstrcat(qfname, "/quotas") ; */ /* possibly examine and adjust "name" */
euser_id = geteuid();
bool disk_quotas(const char *path,SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT *dsize)
{
- (*bsize) = 512; /* This value should be ignored */
+ (*bsize) = 512; /* This value should be ignored */
- /* And just to be sure we set some values that hopefully */
- /* will be larger that any possible real-world value */
- (*dfree) = (SMB_BIG_UINT)-1;
- (*dsize) = (SMB_BIG_UINT)-1;
+ /* And just to be sure we set some values that hopefully */
+ /* will be larger that any possible real-world value */
+ (*dfree) = (SMB_BIG_UINT)-1;
+ (*dsize) = (SMB_BIG_UINT)-1;
- /* As we have select not to use quotas, allways fail */
- return False;
+ /* As we have select not to use quotas, allways fail */
+ return false;
}
#endif /* WITH_QUOTAS */
#else /* HAVE_SYS_QUOTAS */
-/* wrapper to the new sys_quota interface
+/* wrapper to the new sys_quota interface
this file should be removed later
*/
bool disk_quotas(const char *path,SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT *dsize)
* utmp{,x}: try "utmp dir", then default (a define)
* wtmp{,x}: try "wtmp dir", then "utmp dir", then default (a define)
*/
-static void uw_pathname(pstring fname, const char *uw_name, const char *uw_default)
+static char *uw_pathname(TALLOC_CTX *ctx,
+ const char *uw_name,
+ const char *uw_default)
{
- pstring dirname;
-
- pstrcpy(dirname, "");
+ char *dirname = NULL;
/* For w-files, first look for explicit "wtmp dir" */
if (uw_name[0] == 'w') {
- pstrcpy(dirname,lp_wtmpdir());
+ dirname = talloc_strdup(ctx, lp_wtmpdir());
+ if (!dirname) {
+ return NULL;
+ }
trim_char(dirname,'\0','/');
}
/* For u-files and non-explicit w-dir, look for "utmp dir" */
- if (dirname == 0 || strlen(dirname) == 0) {
- pstrcpy(dirname,lp_utmpdir());
+ if (!dirname == 0 || strlen(dirname) == 0) {
+ dirname = talloc_strdup(ctx, lp_utmpdir());
+ if (!dirname) {
+ return NULL;
+ }
trim_char(dirname,'\0','/');
}
/* If explicit directory above, use it */
- if (dirname != 0 && strlen(dirname) != 0) {
- pstrcpy(fname, dirname);
- pstrcat(fname, "/");
- pstrcat(fname, uw_name);
- return;
+ if (dirname && strlen(dirname) != 0) {
+ return talloc_asprintf(ctx,
+ "%s/%s",
+ dirname,
+ uw_name);
}
/* No explicit directory: attempt to use default paths */
*/
DEBUG(2,("uw_pathname: unable to determine pathname\n"));
}
- pstrcpy(fname, uw_default);
+ return talloc_strdup(ctx, uw_default);
}
#ifndef HAVE_PUTUTLINE
-
/****************************************************************************
Update utmp file directly. No subroutine interface: probably a BSD system.
****************************************************************************/
-static void pututline_my(pstring uname, struct utmp *u, bool claim)
+static void pututline_my(const char *uname, struct utmp *u, bool claim)
{
DEBUG(1,("pututline_my: not yet implemented\n"));
/* BSD implementor: may want to consider (or not) adjusting "lastlog" */
Credit: Michail Vidiassov <master@iaas.msu.ru>
****************************************************************************/
-static void updwtmp_my(pstring wname, struct utmp *u, bool claim)
+static void updwtmp_my(const char *wname, struct utmp *u, bool claim)
{
int fd;
struct stat buf;
static void utmp_nox_update(struct utmp *u, bool claim)
{
- pstring uname, wname;
+ char *uname = NULL;
+ char *wname = NULL;
#if defined(PUTUTLINE_RETURNS_UTMP)
struct utmp *urc;
#endif /* PUTUTLINE_RETURNS_UTMP */
- uw_pathname(uname, "utmp", ut_pathname);
+ uname = uw_pathname(talloc_tos(), "utmp", ut_pathname);
+ if (!uname) {
+ return;
+ }
DEBUG(2,("utmp_nox_update: uname:%s\n", uname));
#ifdef HAVE_PUTUTLINE
}
#endif /* HAVE_PUTUTLINE */
- uw_pathname(wname, "wtmp", wt_pathname);
+ wname = uw_pathname(talloc_tos(), "wtmp", wt_pathname);
+ if (!wname) {
+ return;
+ }
DEBUG(2,("utmp_nox_update: wname:%s\n", wname));
if (strlen(wname) != 0) {
#ifdef HAVE_UPDWTMP
DEBUG(1,("utmp_update: have utmpx.h but no getutmpx() function\n"));
utmp_nox_update(u, claim);
#else
- pstring uname, wname;
+ char *uname = NULL;
+ char *wname = NULL;
struct utmpx ux, *uxrc;
getutmpx(u, &ux);
utmp_strcpy(ux.ut_host, hostname, sizeof(ux.ut_host));
#endif
- uw_pathname(uname, "utmpx", ux_pathname);
- uw_pathname(wname, "wtmpx", wx_pathname);
- DEBUG(2,("utmp_update: uname:%s wname:%s\n", uname, wname));
+ uname = uw_pathname(talloc_tos(), "utmpx", ux_pathname);
+ wname = uw_pathname(talloc_tos(), "wtmpx", wx_pathname);
+ if (uname && wname) {
+ DEBUG(2,("utmp_update: uname:%s wname:%s\n", uname, wname));
+ }
+
/*
* Check for either uname or wname being empty.
* Some systems, such as Redhat 6, have a "utmpx.h" which doesn't
* Also, our local installation has not provided an override.
* Drop to non-x method. (E.g. RH6 has good defaults in "utmp.h".)
*/
- if ((strlen(uname) == 0) || (strlen(wname) == 0)) {
+ if (!uname || !wname || (strlen(uname) == 0) || (strlen(wname) == 0)) {
utmp_nox_update(u, claim);
} else {
utmpxname(uname);