From patchwork Mon Nov 27 17:00:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 119759 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp542017qgn; Mon, 27 Nov 2017 09:03:17 -0800 (PST) X-Google-Smtp-Source: AGs4zMawRJUxfO1eXTdcmcB4kSUHVw5ch4XMzGTjZdEz9z8u2EwQiz+MYOQVsktcBlqe/5wBSHKi X-Received: by 10.99.176.76 with SMTP id z12mr25250232pgo.358.1511802197203; Mon, 27 Nov 2017 09:03:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511802197; cv=none; d=google.com; s=arc-20160816; b=pElTq2mndUmxWpD2FEMjP1HO39v8YQHdPYRUtzncMJym7lFhlyDMqOGaEILnCFpCgR iOwVkLYiWdTteRonGoocT2r7N6JhizDlnQm10j//Oio7MOjIFVMFZScgZgxnd4IdIPEE c9YmJTk+jepgLynijPYKdOMGcyPXaOh7baaMYpnv5bfFoKBZunAyiXji2ZdXBnK5AFKX vp4CjGNT+9oTZAk5sjhYbRKoP3giBtSoFfiFybR8Exc/Zz1yto0AHFK36wIxLwUuJu5J L4L3VXCs1h7wqwRstsEbAHZvQ2Q4KKJjCkkeHI5j7hF9E894NNyknVFEpdjkkyEXSCgk P/7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=OamG+/8DqpFByS+ZYldSJf9u4UiWq7bNdzEV8BMxISM=; b=kXWCHTySC/7eS25FnRwMZTClOdbw1J24OWgqhBhy7/BSct19l7BLeVGgWjlWZpWNrT yBvEdQPxm0tnOqnXUm8uYgabYf3tGoY3K+urFuSQ2FuS8yKA+z7GbqEo+HXPTSx8MLBk FNe5Z/+rZSi4waocmPj+KF5nnilzhcocW/xBOGMJOMWPkRvoNJbfBTnZ4HIUYhjipDWe apSa6DvXaPuaPqSZ7neH/qS/4hdnxqBkfvthVqiPwx1tTTWCj7lkvTPQ+EOrBqMEKjRj z8KGfoYJ4foNWdWrmfVS2j3g1CeoKfo8xmQZLwz3T8atfrIOyZFNam2Z1quW+aeSBTgU KYeA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 60si24017390plb.732.2017.11.27.09.03.16; Mon, 27 Nov 2017 09:03:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753888AbdK0RDP (ORCPT + 28 others); Mon, 27 Nov 2017 12:03:15 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:57889 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753024AbdK0RDL (ORCPT ); Mon, 27 Nov 2017 12:03:11 -0500 Received: from wuerfel.lan ([109.193.157.232]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.145]) with ESMTPA (Nemesis) id 0MWjXP-1edz0n0oqR-00Xwgr; Mon, 27 Nov 2017 18:02:46 +0100 From: Arnd Bergmann To: John Stultz , Thomas Gleixner Cc: y2038@lists.linaro.org, libc-alpha@sourceware.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org, Albert ARIBAUD , Arnd Bergmann , Ralf Baechle , "James E.J. Bottomley" , Helge Deller , Alexander Viro , Greg Kroah-Hartman , Ingo Molnar , Frederic Weisbecker , Andrew Morton , Denys Vlasenko , Nicolas Pitre , Dave Martin , Mickael GUENE , linux-mips@linux-mips.org, linux-parisc@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 2/3] y2038: elfcore: use __kernel_old_timeval for process times Date: Mon, 27 Nov 2017 18:00:46 +0100 Message-Id: <20171127170121.634826-2-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20171127170121.634826-1-arnd@arndb.de> References: <20171127170121.634826-1-arnd@arndb.de> X-Provags-ID: V03:K0:rpEDa9aUmmfvYKqaSMaHQ23NvD93GuXx5hKnCwcIpI23kBVnIR5 +o8BM4pjhYnGJMJWsoyqajQsO1ocI2pR1n7dTqmhqwtCgJL4Rxzc+ONJhSra0R0gn0LR9hU zZ1Nl80/JJLz3a3/vvso6J7wvuNA4ksZE+R3n98xPbZgm0PH3l9uOlnNOvznf9+2B35fcWB VPX8w5GmjaK06+cGnk7Yg== X-UI-Out-Filterresults: notjunk:1; V01:K0:qH/KOm9gvzw=:QYo8qV/MTbJZln0IAvo1c6 FdzDJEcoXMviuW6oEo9Pp97Jlo8B9LXjjf/ETBLMjo7DgUdTZzzJFRDWpm8Xl7lx7FH/CquJR 451MtsTlsSWobjvk7xsu8UzevFmZGO6pSiKeaRcECUEEwiiIIBqufZE9D/xRKIiFzHXDpWEPY nWOKxulexjHZL4WhxYzskVRMb5T8qMLAGeTXCWtZQOMRQ9I18XY6+VDhD5SFGSOj3I/7i58x8 eeH6Y27M+xwB5ZBZmP9cCDOktHFMMkdSdz0XlwVBrHk3V0rfFPcObp1Esbib6tPW9eDU+qta3 8uyhoS+y46b2LBDzqXR9B9gM5eSJAcEeBxZrG9WuO9SxlX0pX5qG+l4fGWOXlMR2AMjoCDb5n bmr5cwErEbaymcfxCbvywcQAk35c+ehqpSROsULaqoU8QNvqgZ1lv6e9epnTqhApPdiqBt2cB fXVpLD8afRGC8IQGZlcum/3CzO2u9AntpvXN7cu2n/suQYHeYAsFIDOVQlQT29NDKV9edl7NE wui5OI/3Z22sFfWMpPOQLZXpvmxV7ThaetlzYkCxKdqz3AuxAACI/lc3ge43xj4v6DCp4sTnR aTppKaAcZgA5qj7t3TGBsLKC5q/87uUKCFMEbcGjYtJC0RSoM0U3nLMD4vyuGDBEcPMrrVrgZ P7knRxZsN0qZCmDCCQ5HUeyFkNNSS3lOb7TT7B5nngCA3SEsTjMA7pyALt+i/yaTajSLoiATX weQysAZTnf2uA94nQc19aIq6DPAtnEnlkNPejw== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- arch/mips/kernel/binfmt_elfn32.c | 4 ++-- arch/mips/kernel/binfmt_elfo32.c | 4 ++-- arch/parisc/kernel/binfmt_elf32.c | 4 ++-- fs/binfmt_elf.c | 12 ++++++------ fs/binfmt_elf_fdpic.c | 12 ++++++------ fs/compat_binfmt_elf.c | 4 ++-- include/uapi/linux/elfcore.h | 8 ++++---- 7 files changed, 24 insertions(+), 24 deletions(-) -- 2.9.0 diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c index 89b234844534..2fe2d5573289 100644 --- a/arch/mips/kernel/binfmt_elfn32.c +++ b/arch/mips/kernel/binfmt_elfn32.c @@ -100,7 +100,7 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) #undef TASK_SIZE #define TASK_SIZE TASK_SIZE32 -#undef ns_to_timeval -#define ns_to_timeval ns_to_compat_timeval +#undef ns_to_kernel_old_timeval +#define ns_to_kernel_old_timeval ns_to_compat_timeval #include "../../../fs/binfmt_elf.c" diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index a88c59db3d48..d3c37583ef91 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c @@ -103,7 +103,7 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) #undef TASK_SIZE #define TASK_SIZE TASK_SIZE32 -#undef ns_to_timeval -#define ns_to_timeval ns_to_compat_timeval +#undef ns_to_kernel_old_timeval +#define ns_to_kernel_old_timeval ns_to_compat_timeval #include "../../../fs/binfmt_elf.c" diff --git a/arch/parisc/kernel/binfmt_elf32.c b/arch/parisc/kernel/binfmt_elf32.c index 20dfa081ed0b..ad3ea00c64f7 100644 --- a/arch/parisc/kernel/binfmt_elf32.c +++ b/arch/parisc/kernel/binfmt_elf32.c @@ -92,7 +92,7 @@ struct elf_prpsinfo32 current->thread.map_base = DEFAULT_MAP_BASE32; \ current->thread.task_size = DEFAULT_TASK_SIZE32 \ -#undef ns_to_timeval -#define ns_to_timeval ns_to_compat_timeval +#undef ns_to_kernel_old_timeval +#define ns_to_kernel_old_timeval ns_to_compat_timeval #include "../../../fs/binfmt_elf.c" diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 83732fef510d..7ae716db7d99 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1500,18 +1500,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, diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 429326b6e2e7..89717459224b 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c @@ -1362,17 +1362,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; diff --git a/fs/compat_binfmt_elf.c b/fs/compat_binfmt_elf.c index 504b3c3539dc..5df608af1306 100644 --- a/fs/compat_binfmt_elf.c +++ b/fs/compat_binfmt_elf.c @@ -51,8 +51,8 @@ #define elf_prstatus compat_elf_prstatus #define elf_prpsinfo compat_elf_prpsinfo -#undef ns_to_timeval -#define ns_to_timeval ns_to_compat_timeval +#undef ns_to_kernel_old_timeval +#define ns_to_kernel_old_timeval ns_to_compat_timeval /* * To use this file, asm/elf.h must define compat_elf_check_arch. diff --git a/include/uapi/linux/elfcore.h b/include/uapi/linux/elfcore.h index 0b2c9e16e345..baf03562306d 100644 --- a/include/uapi/linux/elfcore.h +++ b/include/uapi/linux/elfcore.h @@ -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