summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rw-r--r--bin/pax/cpio.c13
-rw-r--r--bin/pax/extern.h4
-rw-r--r--bin/pax/gen_subs.c4
-rw-r--r--bin/pax/tar.c24
4 files changed, 26 insertions, 19 deletions
diff --git a/bin/pax/cpio.c b/bin/pax/cpio.c
index c9b07b14d6c..33358ec1a52 100644
--- a/bin/pax/cpio.c
+++ b/bin/pax/cpio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpio.c,v 1.21 2013/05/25 13:33:47 lum Exp $ */
+/* $OpenBSD: cpio.c,v 1.22 2013/07/03 04:08:29 guenther Exp $ */
/* $NetBSD: cpio.c,v 1.5 1995/03/21 09:07:13 cgd Exp $ */
/*-
@@ -37,6 +37,7 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
+#include <limits.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
@@ -274,6 +275,7 @@ int
cpio_rd(ARCHD *arcn, char *buf)
{
int nsz;
+ u_quad_t val;
HD_CPIO *hd;
/*
@@ -296,8 +298,11 @@ cpio_rd(ARCHD *arcn, char *buf)
arcn->sb.st_nlink = (nlink_t)asc_ul(hd->c_nlink, sizeof(hd->c_nlink),
OCT);
arcn->sb.st_rdev = (dev_t)asc_ul(hd->c_rdev, sizeof(hd->c_rdev), OCT);
- arcn->sb.st_mtime = (time_t)asc_ul(hd->c_mtime, sizeof(hd->c_mtime),
- OCT);
+ val = asc_uqd(hd->c_mtime, sizeof(hd->c_mtime), OCT);
+ if ((time_t)val < 0 || (time_t)val != val)
+ arcn->sb.st_mtime = INT_MAX; /* XXX 2038 */
+ else
+ arcn->sb.st_mtime = val;
arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
# ifdef LONG_OFF_T
arcn->sb.st_size = (off_t)asc_ul(hd->c_filesize,sizeof(hd->c_filesize),
@@ -448,7 +453,7 @@ cpio_wr(ARCHD *arcn)
OCT) ||
ul_asc((u_long)arcn->sb.st_rdev, hd->c_rdev, sizeof(hd->c_rdev),
OCT) ||
- ul_asc((u_long)arcn->sb.st_mtime,hd->c_mtime,sizeof(hd->c_mtime),
+ uqd_asc((u_quad_t)arcn->sb.st_mtime,hd->c_mtime,sizeof(hd->c_mtime),
OCT) ||
ul_asc((u_long)nsz, hd->c_namesize, sizeof(hd->c_namesize), OCT))
goto out;
diff --git a/bin/pax/extern.h b/bin/pax/extern.h
index 1761bccbd46..64697d88d18 100644
--- a/bin/pax/extern.h
+++ b/bin/pax/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.35 2012/12/04 02:27:00 deraadt Exp $ */
+/* $OpenBSD: extern.h,v 1.36 2013/07/03 04:08:29 guenther Exp $ */
/* $NetBSD: extern.h,v 1.5 1996/03/26 23:54:16 mrg Exp $ */
/*-
@@ -172,10 +172,8 @@ void ls_tty(ARCHD *);
void safe_print(const char *, FILE *);
u_long asc_ul(char *, int, int);
int ul_asc(u_long, char *, int, int);
-#ifndef LONG_OFF_T
u_quad_t asc_uqd(char *, int, int);
int uqd_asc(u_quad_t, char *, int, int);
-#endif
size_t fieldcpy(char *, size_t, const char *, size_t);
/*
diff --git a/bin/pax/gen_subs.c b/bin/pax/gen_subs.c
index 551f0307c7b..57390994d8f 100644
--- a/bin/pax/gen_subs.c
+++ b/bin/pax/gen_subs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gen_subs.c,v 1.21 2012/12/04 02:24:45 deraadt Exp $ */
+/* $OpenBSD: gen_subs.c,v 1.22 2013/07/03 04:08:29 guenther Exp $ */
/* $NetBSD: gen_subs.c,v 1.5 1995/03/21 09:07:26 cgd Exp $ */
/*-
@@ -302,7 +302,6 @@ ul_asc(u_long val, char *str, int len, int base)
return(0);
}
-#ifndef LONG_OFF_T
/*
* asc_uqd()
* convert hex/octal character string into a u_quad_t. We do not have to
@@ -398,7 +397,6 @@ uqd_asc(u_quad_t val, char *str, int len, int base)
return(-1);
return(0);
}
-#endif
/*
* Copy at max min(bufz, fieldsz) chars from field to buf, stopping
diff --git a/bin/pax/tar.c b/bin/pax/tar.c
index 0823825bf4b..9064a5191d9 100644
--- a/bin/pax/tar.c
+++ b/bin/pax/tar.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tar.c,v 1.47 2013/04/11 00:44:26 guenther Exp $ */
+/* $OpenBSD: tar.c,v 1.48 2013/07/03 04:08:29 guenther Exp $ */
/* $NetBSD: tar.c,v 1.5 1995/03/21 09:07:49 cgd Exp $ */
/*-
@@ -56,9 +56,7 @@ static size_t expandname(char *, size_t, char **, const char *, size_t);
static u_long tar_chksm(char *, int);
static char *name_split(char *, int);
static int ul_oct(u_long, char *, int, int);
-#ifndef LONG_OFF_T
static int uqd_oct(u_quad_t, char *, int, int);
-#endif
#ifndef SMALL
static int rd_xheader(ARCHD *, char *, off_t, char);
#endif
@@ -199,7 +197,6 @@ ul_oct(u_long val, char *str, int len, int term)
return(0);
}
-#ifndef LONG_OFF_T
/*
* uqd_oct()
* convert an u_quad_t to an octal string. one of many oddball field
@@ -253,7 +250,6 @@ uqd_oct(u_quad_t val, char *str, int len, int term)
return(-1);
return(0);
}
-#endif
/*
* tar_chksm()
@@ -382,6 +378,7 @@ int
tar_rd(ARCHD *arcn, char *buf)
{
HD_TAR *hd;
+ u_quad_t val;
char *pt;
/*
@@ -412,7 +409,11 @@ tar_rd(ARCHD *arcn, char *buf)
#else
arcn->sb.st_size = (off_t)asc_uqd(hd->size, sizeof(hd->size), OCT);
#endif
- arcn->sb.st_mtime = (time_t)asc_ul(hd->mtime, sizeof(hd->mtime), OCT);
+ val = asc_uqd(hd->mtime, sizeof(hd->mtime), OCT);
+ if ((time_t)val < 0 || (time_t)val != val)
+ arcn->sb.st_mtime = INT_MAX; /* XXX 2038 */
+ else
+ arcn->sb.st_mtime = val;
arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
/*
@@ -637,7 +638,7 @@ tar_wr(ARCHD *arcn)
if (ul_oct((u_long)arcn->sb.st_mode, hd->mode, sizeof(hd->mode), 0) ||
ul_oct((u_long)arcn->sb.st_uid, hd->uid, sizeof(hd->uid), 0) ||
ul_oct((u_long)arcn->sb.st_gid, hd->gid, sizeof(hd->gid), 0) ||
- ul_oct((u_long)(u_int)arcn->sb.st_mtime, hd->mtime, sizeof(hd->mtime), 1))
+ uqd_oct(arcn->sb.st_mtime, hd->mtime, sizeof(hd->mtime), 1))
goto out;
/*
@@ -746,6 +747,7 @@ ustar_rd(ARCHD *arcn, char *buf)
int cnt = 0;
dev_t devmajor;
dev_t devminor;
+ u_quad_t val;
/*
* we only get proper sized buffers
@@ -808,7 +810,11 @@ ustar_rd(ARCHD *arcn, char *buf)
#else
arcn->sb.st_size = (off_t)asc_uqd(hd->size, sizeof(hd->size), OCT);
#endif
- arcn->sb.st_mtime = (time_t)asc_ul(hd->mtime, sizeof(hd->mtime), OCT);
+ val = asc_uqd(hd->mtime, sizeof(hd->mtime), OCT);
+ if ((time_t)val < 0 || (time_t)val != val)
+ arcn->sb.st_mtime = INT_MAX; /* XXX 2038 */
+ else
+ arcn->sb.st_mtime = val;
arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;
/*
@@ -1088,7 +1094,7 @@ ustar_wr(ARCHD *arcn)
goto out;
}
if (ul_oct((u_long)arcn->sb.st_mode, hd->mode, sizeof(hd->mode), 3) ||
- ul_oct((u_long)(u_int)arcn->sb.st_mtime,hd->mtime,sizeof(hd->mtime),3))
+ uqd_oct(arcn->sb.st_mtime, hd->mtime, sizeof(hd->mtime), 3))
goto out;
if (!Nflag) {
strncpy(hd->uname, name_uid(arcn->sb.st_uid, 0), sizeof(hd->uname));