[PATCH v2] Use LFS and 64 bit time for installed programs (BZ #15333)
Stefan Liebler
stli@linux.ibm.com
Wed Jan 12 14:13:11 GMT 2022
On 14/12/2021 20:35, DJ Delorie via Libc-alpha wrote:
...
>
> LGTM
> Reviewed-by: DJ Delorie <dj@redhat.com>
>
Starting with this commit a6d2f948b71adcb5ea395cb04833bc645eab45e6, I
get a test fail on s390:
FAIL: resolv/tst-p_secstodate
Test 0: 0 -> 19700101000000
Test 1: 12345 -> 19700101000000
test 1 failedTest 2: 999999999 -> 19700101000000
test 2 failedTest 3: 2147483647 -> 19700101000000
test 3 failedTest 4: 2147483648 -> <overflow>
Test 5: 4294967295 -> <overflow>
It turns out that there is a type-mismatch of time_t on caller and
callee side.
in libresolv.so: resolv/res_debug.c: __p_secstodate(u_long secs)
time_t clock = secs;
struct tm *time = __gmtime_r(&clock, &timebuf);
(gdb) p &clock
$1 = (time_t *) 0x7ffff1c8
(gdb) ptype time_t
type = long long
(gdb) p sizeof(time_t)
$2 = 8
(gdb) x/2xw 0x7ffff1c8
0x7ffff1c8: 0x00000000 0x7fffffff
The secs are stored as 8byte long long on stack and the pointer is
passed to __gmtime_r in libc.so:
time/gmtime.c:
/* Provide a 32-bit variant if needed. */
#if __TIMESIZE != 64
struct tm *
__gmtime_r (const time_t *t, struct tm *tp)
{
__time64_t t64 = *t;
return __gmtime64_r (&t64, tp);
}
#endif
(gdb) ptype time_t
type = long
(gdb) p sizeof(time_t)
$3 = 4
(gdb) p *t
$4 = 0
(gdb) ptype __time64_t
type = long long
On libc.so side, time_t is defined as 4byte long, thus the value of t is
read as 0x0 instead of 0x7fffffff.
resolv/res_debug.c is built with -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64
and time/gmtime.c is built without those defines.
@Adhemerval:
Can you please have a look?
Thanks
Stefan
More information about the Libc-alpha
mailing list