summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2011-04-10 15:47:28 +0000
committerkrw <krw@openbsd.org>2011-04-10 15:47:28 +0000
commit4e245ff644da134beb38807899c688dfb43becf0 (patch)
tree470df7aac1d59fc9299a84cc3aaf1e83ead21b14
parentI am only now noticing the number of sets have not been adjusted after the (diff)
downloadwireguard-openbsd-4e245ff644da134beb38807899c688dfb43becf0.tar.xz
wireguard-openbsd-4e245ff644da134beb38807899c688dfb43becf0.zip
Apply some tough type-love and give rdist a chance to handle files
larger than 2GB. Diff from Stephan R. Gerber via PR#6586, tweaks by me. ok deraadt@
-rw-r--r--usr.bin/rdist/child.c8
-rw-r--r--usr.bin/rdist/client.c24
-rw-r--r--usr.bin/rdist/common.c14
-rw-r--r--usr.bin/rdist/config-data.h6
-rw-r--r--usr.bin/rdist/defs.h6
-rw-r--r--usr.bin/rdist/docmd.c4
-rw-r--r--usr.bin/rdist/rdist.c21
-rw-r--r--usr.bin/rdistd/filesys.c10
-rw-r--r--usr.bin/rdistd/server.c53
9 files changed, 78 insertions, 68 deletions
diff --git a/usr.bin/rdist/child.c b/usr.bin/rdist/child.c
index 331d92b9eae..7de8236a779 100644
--- a/usr.bin/rdist/child.c
+++ b/usr.bin/rdist/child.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: child.c,v 1.14 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: child.c,v 1.15 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -177,7 +177,7 @@ static void
readchild(CHILD *child)
{
char rbuf[BUFSIZ];
- int amt;
+ ssize_t amt;
debugmsg(DM_CALL, "[readchild(%s, %d, %d) start]",
child->c_name, child->c_pid, child->c_readfd);
@@ -196,7 +196,7 @@ readchild(CHILD *child)
*/
while ((amt = read(child->c_readfd, rbuf, sizeof(rbuf))) > 0) {
/* XXX remove these debug calls */
- debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %d bytes]",
+ debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %lld bytes]",
child->c_name, child->c_pid, child->c_readfd, amt);
(void) xwrite(fileno(stdout), rbuf, amt);
@@ -205,7 +205,7 @@ readchild(CHILD *child)
child->c_name, child->c_pid, child->c_readfd);
}
- debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %d errno = %d\n",
+ debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %lld errno = %d\n",
child->c_name, child->c_pid, child->c_readfd, amt, errno);
/*
diff --git a/usr.bin/rdist/client.c b/usr.bin/rdist/client.c
index 930bb6a0508..82844eaa8c1 100644
--- a/usr.bin/rdist/client.c
+++ b/usr.bin/rdist/client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: client.c,v 1.22 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: client.c,v 1.23 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -399,8 +399,8 @@ sendfile(char *rname, opt_t opts, struct stat *stb, char *user,
*/
ENCODE(ername, rname);
- (void) sendcmd(C_RECVREG, "%o %04o %ld %ld %ld %s %s %s",
- opts, stb->st_mode & 07777, (long) stb->st_size,
+ (void) sendcmd(C_RECVREG, "%o %04o %lld %ld %ld %s %s %s",
+ opts, stb->st_mode & 07777, (long long) stb->st_size,
stb->st_mtime, stb->st_atime,
user, group, ername);
if (response() < 0) {
@@ -409,8 +409,8 @@ sendfile(char *rname, opt_t opts, struct stat *stb, char *user,
}
- debugmsg(DM_MISC, "Send file '%s' %ld bytes\n", rname,
- (long) stb->st_size);
+ debugmsg(DM_MISC, "Send file '%s' %lld bytes\n", rname,
+ (long long) stb->st_size);
/*
* Set remote time out alarm handler.
@@ -666,8 +666,8 @@ sendlink(char *rname, opt_t opts, struct stat *stb, char *user,
* Gather and send basic link info
*/
ENCODE(ername, rname);
- (void) sendcmd(C_RECVSYMLINK, "%o %04o %ld %ld %ld %s %s %s",
- opts, stb->st_mode & 07777, (long) stb->st_size,
+ (void) sendcmd(C_RECVSYMLINK, "%o %04o %lld %ld %ld %s %s %s",
+ opts, stb->st_mode & 07777, (long long) stb->st_size,
stb->st_mtime, stb->st_atime,
user, group, ername);
if (response() < 0)
@@ -869,7 +869,7 @@ update(char *rname, opt_t opts, struct stat *statp)
/*
* Parse size
*/
- size = (off_t) strtol(cp, (char **)&cp, 10);
+ size = (off_t) strtoll(cp, (char **)&cp, 10);
if (*cp++ != ' ') {
error("update: size not delimited");
return(US_NOTHING);
@@ -921,8 +921,8 @@ update(char *rname, opt_t opts, struct stat *statp)
debugmsg(DM_MISC, "update(%s,) local mode %04o remote mode %04o\n",
rname, lmode, rmode);
- debugmsg(DM_MISC, "update(%s,) size %ld mtime %d owner '%s' grp '%s'\n",
- rname, (long) size, mtime, owner, group);
+ debugmsg(DM_MISC, "update(%s,) size %lld mtime %d owner '%s' grp '%s'"
+ "\n", rname, (long long) size, mtime, owner, group);
if (statp->st_mtime != mtime) {
if (statp->st_mtime < mtime && IS_ON(opts, DO_YOUNGER)) {
@@ -935,8 +935,8 @@ update(char *rname, opt_t opts, struct stat *statp)
}
if (statp->st_size != size) {
- debugmsg(DM_MISC, "size does not match (%ld != %ld).\n",
- (long) statp->st_size, (long) size);
+ debugmsg(DM_MISC, "size does not match (%lld != %lld).\n",
+ (long long) statp->st_size, (long long) size);
return(US_OUTDATE);
}
diff --git a/usr.bin/rdist/common.c b/usr.bin/rdist/common.c
index 6c8e9d69155..4a3ea958786 100644
--- a/usr.bin/rdist/common.c
+++ b/usr.bin/rdist/common.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: common.c,v 1.23 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: common.c,v 1.24 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -69,7 +69,7 @@ char defowner[64] = "bin"; /* Default owner */
char defgroup[64] = "bin"; /* Default group */
static int sendcmdmsg(int, char *, size_t);
-static int remread(int, u_char *, int);
+static ssize_t remread(int, u_char *, size_t);
static int remmore(void);
/*
@@ -354,15 +354,15 @@ sendcmd(va_alist)
*/
static u_char rembuf[BUFSIZ];
static u_char *remptr;
-static int remleft;
+static ssize_t remleft;
#define remc() (--remleft < 0 ? remmore() : *remptr++)
/*
* Back end to remote read()
*/
-static int
-remread(int fd, u_char *buf, int bufsiz)
+static ssize_t
+remread(int fd, u_char *buf, size_t bufsiz)
{
return(read(fd, (char *)buf, bufsiz));
}
@@ -452,8 +452,8 @@ remline(u_char *buffer, int space, int doclean)
/*
* Non-line-oriented remote read.
*/
-int
-readrem(char *p, int space)
+ssize_t
+readrem(char *p, ssize_t space)
{
if (remleft <= 0) {
/*
diff --git a/usr.bin/rdist/config-data.h b/usr.bin/rdist/config-data.h
index cc1cee4ac9d..608726e19f8 100644
--- a/usr.bin/rdist/config-data.h
+++ b/usr.bin/rdist/config-data.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: config-data.h,v 1.6 2003/06/03 02:56:14 millert Exp $ */
+/* $OpenBSD: config-data.h,v 1.7 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1993 Michael A. Cooper
@@ -82,10 +82,10 @@ typedef struct dirent DIRENTRY;
* Set default write(2) return and amount types.
*/
#if !defined(WRITE_RETURN_T)
-#define WRITE_RETURN_T int /* What write() returns */
+#define WRITE_RETURN_T ssize_t /* What write() returns */
#endif /* WRITE_RETURN_T */
#if !defined(WRITE_AMT_T)
-#define WRITE_AMT_T int /* Amount to write */
+#define WRITE_AMT_T size_t /* Amount to write */
#endif /* WRITE_AMT_T */
#endif /* __configdata_h__ */
diff --git a/usr.bin/rdist/defs.h b/usr.bin/rdist/defs.h
index 378ff9379ea..5dc77403c04 100644
--- a/usr.bin/rdist/defs.h
+++ b/usr.bin/rdist/defs.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: defs.h,v 1.16 2008/01/02 17:44:11 chl Exp $ */
+/* $OpenBSD: defs.h,v 1.17 2011/04/10 15:47:28 krw Exp $ */
#ifndef __DEFS_H__
#define __DEFS_H__
@@ -370,7 +370,7 @@ void coredump(void);
void sighandler(int);
int sendcmd(char, char *, ...);
int remline(u_char *, int, int);
-int readrem(char *, int);
+ssize_t readrem(char *, ssize_t);
char *getusername(UID_T, char *, opt_t);
char *getgroupname(GID_T, char *, opt_t);
int response(void);
@@ -420,7 +420,7 @@ mntent_t *getmntpt(char *, struct stat *, int *);
int is_nfs_mounted(char *, struct stat *, int *);
int is_ro_mounted(char *, struct stat *, int *);
int is_symlinked(char *, struct stat *, int *);
-int getfilesysinfo(char *, long *, long *);
+int getfilesysinfo(char *, int64_t *, int64_t *);
/* gram.c */
int yylex(void);
diff --git a/usr.bin/rdist/docmd.c b/usr.bin/rdist/docmd.c
index 3db7e91604b..90deae56a79 100644
--- a/usr.bin/rdist/docmd.c
+++ b/usr.bin/rdist/docmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: docmd.c,v 1.21 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: docmd.c,v 1.22 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -308,7 +308,7 @@ makeconn(char *rhost)
char *ruser, *cp;
static char *cur_host = NULL;
extern char *locuser;
- extern long min_freefiles, min_freespace;
+ extern int64_t min_freefiles, min_freespace;
extern char *remotemsglist;
char tuser[BUFSIZ], buf[BUFSIZ];
u_char respbuff[BUFSIZ];
diff --git a/usr.bin/rdist/rdist.c b/usr.bin/rdist/rdist.c
index d29b47a7209..9deb307e37f 100644
--- a/usr.bin/rdist/rdist.c
+++ b/usr.bin/rdist/rdist.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rdist.c,v 1.19 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: rdist.c,v 1.20 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -88,6 +88,7 @@ main(int argc, char **argv, char **envp)
char *cp;
int cmdargs = 0;
int c;
+ const char *errstr;
progname = __progname;
@@ -160,10 +161,20 @@ main(int argc, char **argv, char **envp)
error("\"%s\" is not a number.", optarg);
usage();
}
- if (c == 'a')
- min_freespace = atoi(optarg);
- else if (c == 'A')
- min_freefiles = atoi(optarg);
+ if (c == 'a') {
+ min_freespace = (int64_t)strtonum(optarg,
+ 0, LLONG_MAX, &errstr);
+ if (errstr)
+ fatalerr("Minimum free space is %s: "
+ "'%s'", errstr, optarg);
+ }
+ else if (c == 'A') {
+ min_freefiles = (u_int64_t)strtonum(optarg,
+ 0, LLONG_MAX, &errstr);
+ if (errstr)
+ fatalerr("Minimum free files is %s: "
+ "'%s'", errstr, optarg);
+ }
else if (c == 'M')
maxchildren = atoi(optarg);
else if (c == 't')
diff --git a/usr.bin/rdistd/filesys.c b/usr.bin/rdistd/filesys.c
index 8c37fbd22c8..8323f98de54 100644
--- a/usr.bin/rdistd/filesys.c
+++ b/usr.bin/rdistd/filesys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: filesys.c,v 1.11 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: filesys.c,v 1.12 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -402,7 +402,7 @@ is_symlinked(char *path, struct stat *statbuf, int *isvalid)
* information.
*/
int
-getfilesysinfo(char *file, long *freespace, long *freefiles)
+getfilesysinfo(char *file, int64_t *freespace, int64_t *freefiles)
{
#if defined(STATFS_TYPE)
static statfs_t statfsbuf;
@@ -449,11 +449,11 @@ getfilesysinfo(char *file, long *freespace, long *freefiles)
* to < 0 if the field is unsupported for the filesystem type.
*/
#if defined(BROKEN_STATFS)
- if (statfsbuf.f_ffree > 0)
+ if (statfsbuf.f_favail > 0)
#else
- if (statfsbuf.f_ffree >= 0)
+ if (statfsbuf.f_favail >= 0)
#endif /* BROKEN_STATFS */
- *freefiles = statfsbuf.f_ffree;
+ *freefiles = statfsbuf.f_favail;
#else /* !STATFS_TYPE */
diff --git a/usr.bin/rdistd/server.c b/usr.bin/rdistd/server.c
index 06c95f2734d..ab4343583d2 100644
--- a/usr.bin/rdistd/server.c
+++ b/usr.bin/rdistd/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.21 2009/10/27 23:59:42 deraadt Exp $ */
+/* $OpenBSD: server.c,v 1.22 2011/04/10 15:47:28 krw Exp $ */
/*
* Copyright (c) 1983 Regents of the University of California.
@@ -41,8 +41,8 @@ char *ptarget; /* pointer to end of target name */
int catname = 0; /* cat name to target name */
char *sptarget[32]; /* stack of saved ptarget's for directories */
char *fromhost = NULL; /* Client hostname */
-static long min_freespace = 0; /* Minimium free space on a filesystem */
-static long min_freefiles = 0; /* Minimium free # files on a filesystem */
+static int64_t min_freespace = 0; /* Minimium free space on a filesystem */
+static int64_t min_freefiles = 0; /* Minimium free # files on a filesystem */
int oumask; /* Old umask */
static int cattarget(char *);
@@ -656,8 +656,8 @@ query(char *xname)
case S_IFIFO:
#endif
#endif
- (void) sendcmd(QC_YES, "%ld %ld %o %s %s",
- (long) stb.st_size, stb.st_mtime,
+ (void) sendcmd(QC_YES, "%lld %ld %o %s %s",
+ (long long) stb.st_size, stb.st_mtime,
stb.st_mode & 07777,
getusername(stb.st_uid, target, options),
getgroupname(stb.st_gid, target, options));
@@ -794,13 +794,13 @@ recvfile(char *new, opt_t opts, int mode, char *owner, char *group,
wrerr = 0;
olderrno = 0;
for (i = 0; i < size; i += BUFSIZ) {
- int amt = BUFSIZ;
+ off_t amt = BUFSIZ;
cp = buf;
if (i + amt > size)
amt = size - i;
do {
- int j;
+ ssize_t j;
j = readrem(cp, amt);
if (j <= 0) {
@@ -1330,6 +1330,7 @@ setconfig(char *cmd)
{
char *cp = cmd;
char *estr;
+ const char *errstr;
switch (*cp++) {
case SC_HOSTNAME: /* Set hostname */
@@ -1346,19 +1347,17 @@ setconfig(char *cmd)
break;
case SC_FREESPACE: /* Minimium free space */
- if (!isdigit((unsigned char)*cp)) {
- fatalerr("Expected digit, got '%s'.", cp);
- return;
- }
- min_freespace = (unsigned long) atoi(cp);
+ min_freespace = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr);
+ if (errstr)
+ fatalerr("Minimum free space is %s: '%s'", errstr,
+ optarg);
break;
case SC_FREEFILES: /* Minimium free files */
- if (!isdigit((unsigned char)*cp)) {
- fatalerr("Expected digit, got '%s'.", cp);
- return;
- }
- min_freefiles = (unsigned long) atoi(cp);
+ min_freefiles = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr);
+ if (errstr)
+ fatalerr("Minimum free files is %s: '%s'", errstr,
+ optarg);
break;
case SC_LOGGING: /* Logging options */
@@ -1396,7 +1395,7 @@ recvit(char *cmd, int type)
char *owner, *group, *file;
char new[MAXPATHLEN];
char fileb[MAXPATHLEN];
- long freespace = -1, freefiles = -1;
+ int64_t freespace = -1, freefiles = -1;
char *cp = cmd;
/*
@@ -1420,7 +1419,7 @@ recvit(char *cmd, int type)
/*
* Get file size
*/
- size = strtol(cp, &cp, 10);
+ size = (off_t) strtoll(cp, &cp, 10);
if (*cp++ != ' ') {
error("recvit: size not delimited");
return;
@@ -1429,7 +1428,7 @@ recvit(char *cmd, int type)
/*
* Get modification time
*/
- mtime = strtol(cp, &cp, 10);
+ mtime = (time_t) strtol(cp, &cp, 10);
if (*cp++ != ' ') {
error("recvit: mtime not delimited");
return;
@@ -1478,8 +1477,8 @@ recvit(char *cmd, int type)
file = fileb;
debugmsg(DM_MISC,
- "recvit: opts = %04o mode = %04o size = %d mtime = %d",
- opts, mode, size, mtime);
+ "recvit: opts = %04o mode = %04o size = %lld mtime = %d",
+ opts, mode, (long long) size, mtime);
debugmsg(DM_MISC,
"recvit: owner = '%s' group = '%s' file = '%s' catname = %d isdir = %d",
owner, group, file, catname, (type == S_IFDIR) ? 1 : 0);
@@ -1523,7 +1522,7 @@ recvit(char *cmd, int type)
*/
if (min_freespace || min_freefiles) {
/* Convert file size to kilobytes */
- long fsize = (long) (size / 1024);
+ int64_t fsize = (int64_t)size / 1024;
if (getfilesysinfo(target, &freespace, &freefiles) != 0)
return;
@@ -1535,15 +1534,15 @@ recvit(char *cmd, int type)
if (min_freespace && (freespace >= 0) &&
(freespace - fsize < min_freespace)) {
error(
- "%s: Not enough free space on filesystem: min %d free %d",
- target, min_freespace, freespace);
+ "%s: Not enough free space on filesystem: min %lld "
+ "free %lld", target, min_freespace, freespace);
return;
}
if (min_freefiles && (freefiles >= 0) &&
(freefiles - 1 < min_freefiles)) {
error(
- "%s: Not enough free files on filesystem: min %d free %d",
- target, min_freefiles, freefiles);
+ "%s: Not enough free files on filesystem: min %lld free "
+ "%lld", target, min_freefiles, freefiles);
return;
}
}