summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/includes.h4
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/include/smb.h4
-rw-r--r--source3/lib/util.c11
-rw-r--r--source3/nmbsync.c16
-rw-r--r--source3/smbd/ipc.c9
-rw-r--r--source3/smbd/quotas.c45
-rw-r--r--source3/smbd/reply.c10
-rw-r--r--source3/smbd/server.c54
-rw-r--r--source3/smbd/uid.c2
-rw-r--r--source3/utils/smbpasswd.c4
11 files changed, 115 insertions, 48 deletions
diff --git a/source3/include/includes.h b/source3/include/includes.h
index 03c2d461e6..15a5e74e46 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -541,7 +541,9 @@ char *mktemp(char *); /* No standard include */
#define NEED_AUTH_PARAMETERS
#endif
#define SIGNAL_CAST (void (*)(__harg))
+#ifndef HPUX10 /* This is only needed for HPUX 9.x */
#define SELECT_CAST (int *)
+#endif /* HPUX10 */
#define SYSV
#define USE_WAITPID
#define WAIT3_CAST2 (int *)
@@ -550,7 +552,7 @@ char *mktemp(char *); /* No standard include */
#define USE_SETRES
#define DEFAULT_PRINTING PRINT_HPUX
#define SIGCLD_IGNORE
-#endif
+#endif /* HPUX */
#ifdef SEQUENT
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 0fa4251b82..56bdbfe865 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -703,8 +703,8 @@ void close_file(int fnum);
BOOL check_file_sharing(int cnum,char *fname);
void open_file_shared(int fnum,int cnum,char *fname,int share_mode,int ofun,
int mode,int *Access,int *action);
-int seek_file(int fnum,int pos);
-int read_file(int fnum,char *data,int pos,int n);
+int seek_file(int fnum,uint32 pos);
+int read_file(int fnum,char *data,uint32 pos,int n);
int write_file(int fnum,char *data,int n);
BOOL become_service(int cnum,BOOL do_chdir);
int find_service(char *service);
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 2b6888b8a7..0f2dc01865 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -314,11 +314,11 @@ typedef struct
int cnum;
file_fd_struct *fd_ptr;
int pos;
- int size;
+ uint32 size;
int mode;
int uid;
char *mmap_ptr;
- int mmap_size;
+ uint32 mmap_size;
write_bmpx_struct *wbmpx_ptr;
struct timeval open_time;
BOOL open;
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 9982d105ad..ca17fbdcb4 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -1260,11 +1260,18 @@ int ChDir(char *path)
********************************************************************/
static char *Dumb_GetWd(char *s)
{
+ char *p;
#ifdef USE_GETCWD
- return ((char *)getcwd(s,sizeof(pstring)));
+ p = (char *)getcwd(s,sizeof(pstring));
#else
- return ((char *)getwd(s));
+ p = (char *)getwd(s));
#endif
+ if(!p)
+ return NULL;
+
+ /* Ensure we always return in dos format. */
+ unix_to_dos(p,True);
+ return p;
}
diff --git a/source3/nmbsync.c b/source3/nmbsync.c
index 97e7e02b2b..a140b7a1bd 100644
--- a/source3/nmbsync.c
+++ b/source3/nmbsync.c
@@ -176,12 +176,14 @@ void sync_browse_lists(struct subnet_record *d, struct work_record *work,
if (cli_open_sockets(SMB_PORT))
{
if (cli_send_login(NULL,NULL,True,True))
- {
- add_info(d, work, local_type|SV_TYPE_DOMAIN_ENUM);
- add_info(d, work, local_type|(SV_TYPE_ALL&
- ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY)));
- }
+ {
+ add_info(d, work, local_type|SV_TYPE_DOMAIN_ENUM);
+ if(local)
+ add_info(d, work, SV_TYPE_LOCAL_LIST_ONLY);
+ else
+ add_info(d, work, SV_TYPE_ALL);
+ }
- close_sockets();
- }
+ close_sockets();
+ }
}
diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c
index d6d2f289aa..e21021c0ac 100644
--- a/source3/smbd/ipc.c
+++ b/source3/smbd/ipc.c
@@ -991,6 +991,15 @@ static BOOL api_RNetServerEnum(int cnum, uint16 vuid, char *param, char *data,
if (servertype == SV_TYPE_ALL)
servertype &= ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY);
+ /* If someone sets SV_TYPE_LOCAL_LIST_ONLY but hasn't set
+ any other bit (they may just set this bit on it's own) they
+ want all the locally seen servers. However this bit can be
+ set on its own so set the requested servers to be
+ ALL - DOMAIN_ENUM. */
+
+ if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) && !(servertype & SV_TYPE_DOMAIN_ENUM))
+ servertype = SV_TYPE_ALL & ~(SV_TYPE_DOMAIN_ENUM);
+
domain_request = ((servertype & SV_TYPE_DOMAIN_ENUM) != 0);
local_request = ((servertype & SV_TYPE_LOCAL_LIST_ONLY) != 0);
diff --git a/source3/smbd/quotas.c b/source3/smbd/quotas.c
index 883c2c050d..d19d386e27 100644
--- a/source3/smbd/quotas.c
+++ b/source3/smbd/quotas.c
@@ -331,8 +331,8 @@ BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
ret = quotactl(Q_GETQUOTA, name, euser_id, &D);
#endif
- seteuid(euser_id); /* Restore the original uid status. */
- setuid(user_id);
+ setuid(user_id); /* Restore the original uid status. */
+ seteuid(euser_id);
if (ret < 0) {
DEBUG(2,("disk_quotas ioctl (Solaris) failed\n"));
@@ -363,6 +363,47 @@ DEBUG(5,("disk_quotas for path \"%s\" returning bsize %d, dfree %d, dsize %d\n"
return(True);
}
+
+#elif defined(OSF1)
+#include <ufs/quota.h>
+
+/****************************************************************************
+try to get the disk space from disk quotas - OFS1 version
+****************************************************************************/
+BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
+{
+ uid_t user_id, euser_id;
+ int r;
+ struct dqblk D;
+ struct stat S;
+
+ euser_id = geteuid();
+ user_id = getuid();
+
+ setreuid(euser_id, euser_id);
+ r= quotactl(path,QCMD(Q_GETQUOTA, USRQUOTA),euser_id,(char *) &D);
+ if (setreuid(user_id, euser_id) == -1)
+ DEBUG(5,("Unable to reset uid to %d\n", user_id));
+
+ *bsize = DEV_BSIZE;
+
+ if (r)
+ return(False);
+
+ /* Use softlimit to determine disk space, except when it has been exceeded */
+
+ if (D.dqb_bsoftlimit==0)
+ return(False);
+
+ if ((D.dqb_curblocks>D.dqb_bsoftlimit)) {
+ *dfree = 0;
+ *dsize = D.dqb_curblocks;
+ } else {
+ *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
+ *dsize = D.dqb_bsoftlimit;
+ }
+ return (True);
+}
#else
#ifdef __FreeBSD__
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 374a01b665..0216b58c34 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1374,7 +1374,7 @@ int reply_readbraw(char *inbuf, char *outbuf)
{
int cnum,maxcount,mincount,fnum;
int nread = 0;
- int startpos;
+ uint32 startpos;
char *header = outbuf;
int ret=0;
int fd;
@@ -1418,7 +1418,7 @@ int reply_readbraw(char *inbuf, char *outbuf)
Files[fnum].size = size;
}
- nread = MIN(maxcount,size - startpos);
+ nread = MIN(maxcount,(int)(size - startpos));
}
if (nread < mincount)
@@ -1515,7 +1515,7 @@ int reply_read(char *inbuf,char *outbuf)
int cnum,numtoread,fnum;
int nread = 0;
char *data;
- int startpos;
+ uint32 startpos;
int outsize = 0;
cnum = SVAL(inbuf,smb_tid);
@@ -3081,7 +3081,7 @@ int reply_readbmpx(char *inbuf,char *outbuf,int length,int bufsize)
int nread = -1;
int total_read;
char *data;
- int32 startpos;
+ uint32 startpos;
int outsize, mincount, maxcount;
int max_per_packet;
int tcount;
@@ -3152,7 +3152,7 @@ int reply_writebmpx(char *inbuf,char *outbuf)
int cnum,numtowrite,fnum;
int nwritten = -1;
int outsize = 0;
- int32 startpos;
+ uint32 startpos;
int tcount, write_through, smb_doff;
char *data;
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 35774c0a43..3d5b75794b 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -1704,20 +1704,21 @@ void open_file_shared(int fnum,int cnum,char *fname,int share_mode,int ofun,
/****************************************************************************
seek a file. Try to avoid the seek if possible
****************************************************************************/
-int seek_file(int fnum,int pos)
+int seek_file(int fnum,uint32 pos)
{
- int offset = 0;
+ uint32 offset = 0;
if (Files[fnum].print_file && POSTSCRIPT(Files[fnum].cnum))
offset = 3;
- Files[fnum].pos = lseek(Files[fnum].fd_ptr->fd,pos+offset,SEEK_SET) - offset;
+ Files[fnum].pos = (int)(lseek(Files[fnum].fd_ptr->fd,pos+offset,SEEK_SET)
+ - offset);
return(Files[fnum].pos);
}
/****************************************************************************
read from a file
****************************************************************************/
-int read_file(int fnum,char *data,int pos,int n)
+int read_file(int fnum,char *data,uint32 pos,int n)
{
int ret=0,readret;
@@ -1733,7 +1734,7 @@ int read_file(int fnum,char *data,int pos,int n)
#if USE_MMAP
if (Files[fnum].mmap_ptr)
{
- int num = MIN(n,Files[fnum].mmap_size-pos);
+ int num = MIN(n,(int)(Files[fnum].mmap_size-pos));
if (num > 0)
{
memcpy(data,Files[fnum].mmap_ptr+pos,num);
@@ -2541,22 +2542,25 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de
pcon->ngroups = 0;
pcon->groups = NULL;
- /* Find all the groups this uid is in and store them. Used by become_user() */
- setup_groups(pcon->user,pcon->uid,pcon->gid,&pcon->ngroups,&pcon->igroups,&pcon->groups);
+ if (!IS_IPC(cnum))
+ {
+ /* Find all the groups this uid is in and store them. Used by become_user() */
+ setup_groups(pcon->user,pcon->uid,pcon->gid,&pcon->ngroups,&pcon->igroups,&pcon->groups);
- /* check number of connections */
- if (!claim_connection(cnum,
+ /* check number of connections */
+ if (!claim_connection(cnum,
lp_servicename(SNUM(cnum)),
lp_max_connections(SNUM(cnum)),False))
- {
- DEBUG(1,("too many connections - rejected\n"));
- return(-8);
- }
+ {
+ DEBUG(1,("too many connections - rejected\n"));
+ return(-8);
+ }
- if (lp_status(SNUM(cnum)))
- claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection);
+ if (lp_status(SNUM(cnum)))
+ claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection);
- first_connection = False;
+ first_connection = False;
+ } /* IS_IPC */
pcon->open = True;
@@ -2574,13 +2578,13 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de
{
DEBUG(0,("Can't become connected user!\n"));
pcon->open = False;
- yield_connection(cnum,
+ if (!IS_IPC(cnum)) {
+ yield_connection(cnum,
lp_servicename(SNUM(cnum)),
lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
- {
- return(-1);
+ if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
}
+ return(-1);
}
if (ChDir(pcon->connectpath) != 0)
@@ -2589,13 +2593,13 @@ int make_connection(char *service,char *user,char *password, int pwlen, char *de
pcon->connectpath,strerror(errno)));
pcon->open = False;
unbecome_user();
- yield_connection(cnum,
+ if (!IS_IPC(cnum)) {
+ yield_connection(cnum,
lp_servicename(SNUM(cnum)),
lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
- {
- return(-5);
+ if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
}
+ return(-5);
}
string_set(&pcon->origpath,pcon->connectpath);
@@ -3420,7 +3424,7 @@ void exit_server(char *reason)
DEBUG(2,("Closing connections\n"));
for (i=0;i<MAX_CONNECTIONS;i++)
if (Connections[i].open)
- close_cnum(i,-1);
+ close_cnum(i,(uint16)-1);
#ifdef DFS_AUTH
if (dcelogin_atmost_once)
dfs_unlogin();
diff --git a/source3/smbd/uid.c b/source3/smbd/uid.c
index 4ffdb0923e..cdc4e474c6 100644
--- a/source3/smbd/uid.c
+++ b/source3/smbd/uid.c
@@ -253,10 +253,12 @@ BOOL become_user(int cnum, uint16 vuid)
if (!become_gid(gid)) return(False);
#ifndef NO_SETGROUPS
+ if (!IS_IPC(cnum)) {
/* groups stuff added by ih/wreu */
if (current_user.ngroups > 0)
if (setgroups(current_user.ngroups,current_user.groups)<0)
DEBUG(0,("setgroups call failed!\n"));
+ }
#endif
if (!Connections[cnum].admin_user && !become_uid(uid))
diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c
index 7a4a1e2cdb..161555d52c 100644
--- a/source3/utils/smbpasswd.c
+++ b/source3/utils/smbpasswd.c
@@ -269,7 +269,7 @@ static void usage(char *name)
if ((argv[1][0] == '-') && (argv[1][1] == 'a'))
add_user = True;
- if(add_user && (argc < 2 || argc > 4))
+ if(add_user && (argc <= 2 || argc > 4))
usage(argv[0]);
/* root can specify password on command-line */
@@ -338,7 +338,7 @@ static void usage(char *name)
p = getpass("Retype new SMB password:");
- if (strcmp(p, new_passwd))
+ if (strncmp(p, new_passwd, sizeof(fstring)-1))
{
fprintf(stderr, "%s: Mismatch - password unchanged.\n", argv[0]);
exit(1);