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:
parent
499c5aad0c
commit
bce1ff5f88
14
printstat.h
14
printstat.h
@ -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
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user