$NetBSD: patch-an,v 1.2 2010/06/12 19:36:01 dholland Exp $ Print and parse time_t as intmax_t, not as long (which might not fit). Likewise for (perhaps only some uses of) off_t. --- src/client.c.orig 1999-11-01 00:22:14.000000000 +0000 +++ src/client.c @@ -433,9 +433,9 @@ static int sendfile(rname, opts, stb, us debugmsg(DM_MISC, "Turning off compression"); } - (void) sendcmd(C_RECVREG, "%o %04o %ld %ld %ld %s %s %s", - opts, stb->st_mode & 07777, (long) stb->st_size, - stb->st_mtime, stb->st_atime, + (void) sendcmd(C_RECVREG, "%o %04o %jd %jd %jd %s %s %s", + opts, stb->st_mode & 07777, (intmax_t) stb->st_size, + (intmax_t)stb->st_mtime, (intmax_t)stb->st_atime, user, group, ername); if (response() < 0) { (void) close(f); @@ -450,8 +450,8 @@ static int sendfile(rname, opts, stb, us } } - debugmsg(DM_MISC, "Send file '%s' %ld bytes%s\n", rname, - (long) stb->st_size, rem_wz ? " (compressing)" : ""); + debugmsg(DM_MISC, "Send file '%s' %jd bytes%s\n", rname, + (intmax_t) stb->st_size, rem_wz ? " (compressing)" : ""); /* * Set remote time out alarm handler. @@ -732,9 +732,9 @@ static int sendlink(rname, opts, stb, us * 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, - stb->st_mtime, stb->st_atime, + (void) sendcmd(C_RECVSYMLINK, "%o %04o %jd %jd %jd %s %s %s", + opts, stb->st_mode & 07777, (intmax_t) stb->st_size, + (intmax_t)stb->st_mtime, (intmax_t)stb->st_atime, user, group, ername); if (response() < 0) return(-1); @@ -833,6 +833,7 @@ static int update(rname, opts, statp) { off_t size; time_t mtime; + intmax_t size_big, mtime_big; unsigned short lmode; unsigned short rmode; char *owner = NULL, *group = NULL; @@ -921,7 +922,12 @@ static int update(rname, opts, statp) /* * Parse size */ - size = (off_t) strtol(cp, (char **)&cp, 10); + size_big = strtoimax(cp, (char **)&cp, 10); + if ((intmax_t)(off_t)size_big != size_big) { + error("update: size out of range"); + return(US_NOTHING); + } + size = (off_t)size_big; if (*cp++ != ' ') { error("update: size not delimited"); return(US_NOTHING); @@ -930,7 +936,12 @@ static int update(rname, opts, statp) /* * Parse mtime */ - mtime = strtol(cp, (char **)&cp, 10); + mtime_big = strtoimax(cp, (char **)&cp, 10); + if ((intmax_t)(off_t)mtime_big != mtime_big) { + error("update: mtime out of range"); + return(US_NOTHING); + } + mtime = (time_t)mtime_big; if (*cp++ != ' ') { error("update: mtime not delimited"); return(US_NOTHING); @@ -973,8 +984,8 @@ static int update(rname, opts, 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 %jd mtime %jd owner '%s' grp '%s'\n", + rname, (intmax_t)size, (intmax_t)mtime, owner, group); if (statp->st_mtime != mtime) { if (statp->st_mtime < mtime && IS_ON(opts, DO_YOUNGER)) { @@ -987,8 +998,8 @@ static int update(rname, opts, 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 (%jd != %jd).\n", + (intmax_t)statp->st_size, (intmax_t)size); return(US_OUTDATE); }