y2038: elfcore: Use __kernel_old_timeval for process times
authorArnd Bergmann <arnd@arndb.de>
Thu, 23 Nov 2017 12:46:33 +0000 (13:46 +0100)
committerArnd Bergmann <arnd@arndb.de>
Fri, 15 Nov 2019 13:38:29 +0000 (14:38 +0100)
We store elapsed time for a crashed process in struct elf_prstatus using
'timeval' structures. Once glibc starts using 64-bit time_t, this becomes
incompatible with the kernel's idea of timeval since the structure layout
no longer matches on 32-bit architectures.

This changes the definition of the elf_prstatus structure to use
__kernel_old_timeval instead, which is hardcoded to the currently used
binary layout. There is no risk of overflow in y2038 though, because
the time values are all relative times, and can store up to 68 years
of process elapsed time.

There is a risk of applications breaking at build time when they
use the new kernel headers and expect the type to be exactly 'timeval'
rather than a structure that has the same fields as before. Those
applications have to be modified to deal with 64-bit time_t anyway.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/mips/kernel/binfmt_elfn32.c
arch/mips/kernel/binfmt_elfo32.c
fs/binfmt_elf.c
fs/binfmt_elf_fdpic.c
fs/compat_binfmt_elf.c
include/uapi/linux/elfcore.h

index 7a12763d553aee50fd61f440e08cfef058ed3884..6ee3f7218c675b6c605d06776ef1164ef6d13441 100644 (file)
@@ -100,7 +100,7 @@ jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
 #undef TASK_SIZE
 #define TASK_SIZE TASK_SIZE32
 
-#undef ns_to_timeval
-#define ns_to_timeval ns_to_old_timeval32
+#undef ns_to_kernel_old_timeval
+#define ns_to_kernel_old_timeval ns_to_old_timeval32
 
 #include "../../../fs/binfmt_elf.c"
index e6db06a1d31a9bdc15d40d00096f1fb0834c412e..6dd103d3cebba2f299fa60489b65c9377f975ee4 100644 (file)
@@ -103,7 +103,7 @@ jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
 #undef TASK_SIZE
 #define TASK_SIZE TASK_SIZE32
 
-#undef ns_to_timeval
-#define ns_to_timeval ns_to_old_timeval32
+#undef ns_to_kernel_old_timeval
+#define ns_to_kernel_old_timeval ns_to_old_timeval32
 
 #include "../../../fs/binfmt_elf.c"
index c5642bcb6b468f9ed4e4fe2ff7012eb4fe024f9f..5372eabd276ab6ec31d6e70f5de0a460cb8ffae9 100644 (file)
@@ -1489,18 +1489,18 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
                 * group-wide total, not its individual thread total.
                 */
                thread_group_cputime(p, &cputime);
-               prstatus->pr_utime = ns_to_timeval(cputime.utime);
-               prstatus->pr_stime = ns_to_timeval(cputime.stime);
+               prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
+               prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
        } else {
                u64 utime, stime;
 
                task_cputime(p, &utime, &stime);
-               prstatus->pr_utime = ns_to_timeval(utime);
-               prstatus->pr_stime = ns_to_timeval(stime);
+               prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
+               prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
        }
 
-       prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
-       prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
+       prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
+       prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
 }
 
 static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
index d86ebd0dcc3d3063051a0f313b7f28909de6492e..240f6666354377a8ea818df0299d8d1f5200fa52 100644 (file)
@@ -1359,17 +1359,17 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
                 * group-wide total, not its individual thread total.
                 */
                thread_group_cputime(p, &cputime);
-               prstatus->pr_utime = ns_to_timeval(cputime.utime);
-               prstatus->pr_stime = ns_to_timeval(cputime.stime);
+               prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
+               prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
        } else {
                u64 utime, stime;
 
                task_cputime(p, &utime, &stime);
-               prstatus->pr_utime = ns_to_timeval(utime);
-               prstatus->pr_stime = ns_to_timeval(stime);
+               prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
+               prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
        }
-       prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
-       prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
+       prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
+       prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
 
        prstatus->pr_exec_fdpic_loadmap = p->mm->context.exec_fdpic_loadmap;
        prstatus->pr_interp_fdpic_loadmap = p->mm->context.interp_fdpic_loadmap;
index b7f9ffa1d5f173475feb8630be9183f78296e727..aaad4ca1217ef116494ea7315de081b0f3c36c4c 100644 (file)
@@ -48,8 +48,8 @@
 #define elf_prstatus   compat_elf_prstatus
 #define elf_prpsinfo   compat_elf_prpsinfo
 
-#undef ns_to_timeval
-#define ns_to_timeval ns_to_old_timeval32
+#undef ns_to_kernel_old_timeval
+#define ns_to_kernel_old_timeval ns_to_old_timeval32
 
 /*
  * To use this file, asm/elf.h must define compat_elf_check_arch.
index 0b2c9e16e34509da45d0441018e8229e1829fbb5..baf03562306d8e90faf328d2d3888bca4f673e0a 100644 (file)
@@ -53,10 +53,10 @@ struct elf_prstatus
        pid_t   pr_ppid;
        pid_t   pr_pgrp;
        pid_t   pr_sid;
-       struct timeval pr_utime;        /* User time */
-       struct timeval pr_stime;        /* System time */
-       struct timeval pr_cutime;       /* Cumulative user time */
-       struct timeval pr_cstime;       /* Cumulative system time */
+       struct __kernel_old_timeval pr_utime;   /* User time */
+       struct __kernel_old_timeval pr_stime;   /* System time */
+       struct __kernel_old_timeval pr_cutime;  /* Cumulative user time */
+       struct __kernel_old_timeval pr_cstime;  /* Cumulative system time */
 #if 0
        long    pr_instr;               /* Current instruction */
 #endif