Fix stat64 st_[acm]time decoding for personalities with 32-bit time_t

STRUCT_STAT.st_[acm]time are declared as unsigned int for some
personalities, while time_t is signed.

* printstat.h (DO_PRINTSTAT): If st_[acm]time have the same size as int,
explicitly cast them to int.
* tests/stat64-v.test: Test that negative time_t is decoded properly.

Reported-by: Andreas Schwab <schwab@suse.de>
This commit is contained in:
Дмитрий Левин 2015-03-12 16:59:01 +00:00
parent 499c5aad0c
commit bce1ff5f88
2 changed files with 12 additions and 5 deletions

View File

@ -57,9 +57,17 @@ DO_PRINTSTAT(struct tcb *tcp, const STRUCT_STAT *statbuf)
}
if (!abbrev(tcp)) {
tprintf("st_atime=%s, ", sprinttime(statbuf->st_atime));
tprintf("st_mtime=%s, ", sprinttime(statbuf->st_mtime));
tprintf("st_ctime=%s", sprinttime(statbuf->st_ctime));
const bool cast = sizeof(statbuf->st_atime) == sizeof(int);
tprintf("st_atime=%s, ",
sprinttime(cast ? (time_t) (int) statbuf->st_atime:
(time_t) statbuf->st_atime));
tprintf("st_mtime=%s, ",
sprinttime(cast ? (time_t) (int) statbuf->st_mtime:
(time_t) statbuf->st_mtime));
tprintf("st_ctime=%s",
sprinttime(cast ? (time_t) (int) statbuf->st_ctime:
(time_t) statbuf->st_ctime));
#if HAVE_STRUCT_STAT_ST_FLAGS
tprintf(", st_flags=%u", (unsigned int) statbuf->st_flags);
#endif

View File

@ -22,8 +22,7 @@ $truncate_cmd > "$OUT" 2>&1 || {
./stat $sample > /dev/null ||
fail_ 'stat failed'
touch -d '1970-01-01 36028797018963968 seconds' $sample ||
touch -t 0102030405 $sample
touch -d '1970-01-01 -42 seconds' $sample
for f in $sample . /dev/null; do
args="-v -efile ./stat $f"