diff options
Diffstat (limited to 'lib/tar')
| -rw-r--r-- | lib/tar/read_header.c | 19 | 
1 files changed, 15 insertions, 4 deletions
| diff --git a/lib/tar/read_header.c b/lib/tar/read_header.c index 043b5ff..a083c2f 100644 --- a/lib/tar/read_header.c +++ b/lib/tar/read_header.c @@ -129,11 +129,11 @@ static int read_pax_header(int fd, uint64_t entsize, unsigned int *set_by_pax,  			if (line[6] == '-') {  				if (pax_read_decimal(line + 7, &field))  					goto fail; -				out->sb.st_mtime = -((int64_t)field); +				out->mtime = -((int64_t)field);  			} else {  				if (pax_read_decimal(line + 6, &field))  					goto fail; -				out->sb.st_mtime = field; +				out->mtime = field;  			}  			*set_by_pax |= PAX_MTIME;  		} else if (!strncmp(line, "GNU.sparse.name=", 16)) { @@ -284,9 +284,9 @@ static int decode_header(const tar_header_t *hdr, unsigned int set_by_pax,  			return -1;  		if (field & 0x8000000000000000UL) {  			field = ~field + 1; -			out->sb.st_mtime = -((int64_t)field); +			out->mtime = -((int64_t)field);  		} else { -			out->sb.st_mtime = field; +			out->mtime = field;  		}  	} @@ -338,6 +338,17 @@ static int decode_header(const tar_header_t *hdr, unsigned int set_by_pax,  		break;  	} +#if SIZEOF_TIME_T < 8 +	if (out->mtime > (int64_t)INT32_MAX) { +		out->sb.st_mtime = INT32_MAX; +	} else if (out->mtime < (int64_t)INT32_MIN) { +		out->sb.st_mtime = INT32_MIN; +	} else { +		out->sb.st_mtime = out->mtime; +	} +#else +	out->sb.st_mtime = out->mtime; +#endif  	return 0;  } | 
