From patchwork Thu Oct 19 09:53:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 10016323 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 42B1560215 for ; Thu, 19 Oct 2017 09:54:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1D01427FB3 for ; Thu, 19 Oct 2017 09:54:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0E70528434; Thu, 19 Oct 2017 09:54:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E89227FB3 for ; Thu, 19 Oct 2017 09:54:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752660AbdJSJyc (ORCPT ); Thu, 19 Oct 2017 05:54:32 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:57847 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752118AbdJSJyb (ORCPT ); Thu, 19 Oct 2017 05:54:31 -0400 Received: from wuerfel.lan ([46.223.139.202]) by mrelayeu.kundenserver.de (mreue007 [212.227.15.129]) with ESMTPA (Nemesis) id 0Ld8Mf-1dNVFi19hR-00iXQU; Thu, 19 Oct 2017 11:54:11 +0200 From: Arnd Bergmann To: Kentaro Takeda , Tetsuo Handa , James Morris , "Serge E. Hallyn" Cc: y2038@lists.linaro.org, Deepa Dinamani , Arnd Bergmann , Ingo Molnar , linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] tomoyo: fix timestamping for y2038 Date: Thu, 19 Oct 2017 11:53:40 +0200 Message-Id: <20171019095405.689783-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:0ZoMa8/mIFmyFoEqg/up87V908h0fbIAtizvvn6frJ5IPX5Ekei RjlmmRyUa4iuv2leygxm32H5DoIu9cQhhesUc9jpM5EhQOGpQtBOUCMk80Yr3FT/RTOZ1ko mPKW3XYTT4MruKdJZjobSc5cnWlXJ7xTRKMpCzN4TUwiw1mTs9fxTZJyq6evGvyUOOUMjyA UwZUyvYOItr9+eZFqYN/Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:qHFLHt73v98=:1V3RolG6IFI5H3qSrw87Am Om/u7p47XdsNwl4+Jv+SHftHrvTcVRY4G6q5C2Kisgb5xt3CsR9uvrud89WK4YVaurt32Uq1+ Lb6nAQoDk+B1z+/5Lzi/qxkD30rooEbPbnZghmcFOjG58nVQQ01oVWJHbRT4HrYddFDg7nAr7 g6uIywBVtz3z4SjtGh57AMqr/Yo2P5J7SBYU99NDTNgclKyWEAiW6bVwxWNz7McDBsiPiB3R6 V7w6IsQBFus7jqnZ2zPgtOwkbbcxf59naOoia/LjLSfEr+3f5W1IMMkANzwyMDutfUR3SFZiq rCO5J2V/jeOWbEGy4+IPpBIEHLi3K6yzSjL1IdM12Cl0ws9U3CHNLnrDySc/jWJGVSudEvlTy 6uTC0MSRrybiJQt5iEDxYDQPseZeSND6lHYPd8QhU/7QGlyLTowpvILlEm9O2VceIJ1BpPWeV 1bXOEHPcbuKAiao2qEQmy5akQsRsqANY5aLpOeuCIh+AI4KD8D4ateMraFCpWRtTSv0Vdd8F6 btvW5afQtxuQTFATIwFkXvIK+EVb3phW5N/i/7KSGNTfi+C/Yiv083PhsScsWP/1NWlOGGtFX jfSyuAESGg8rcekyFP/bw5/S5RNwBHjYtyIYtpUne/rpPhjT3LuNDuELYMon9KG/U+l972+ko N31Gtr8wj8Yi+96fEODTjuM3uUqjlGzQSRZ/OIvscopDh5Z8tTfXXzN1CR1DMPjcZQlCGKbFQ apPDMrc9JTndsNhDPwgWmcEHZZsWu/FNaTfpCg== Sender: owner-linux-security-module@vger.kernel.org Precedence: bulk List-ID: X-Virus-Scanned: ClamAV using ClamSMTP Tomoyo uses an open-coded version of time_to_tm() to create a timestamp from the current time as read by get_seconds(). This will overflow and give wrong results on 32-bit systems in 2038. To correct this, this changes the code to use ktime_get_real_seconds() and the generic time64_to_tm() function that are both y2038-safe. Using the library function avoids adding an expensive 64-bit division in this code and can benefit from any optimizations we do in common code. Signed-off-by: Arnd Bergmann --- security/tomoyo/audit.c | 2 +- security/tomoyo/common.c | 4 ++-- security/tomoyo/common.h | 2 +- security/tomoyo/util.c | 39 +++++++++------------------------------ 4 files changed, 13 insertions(+), 34 deletions(-) diff --git a/security/tomoyo/audit.c b/security/tomoyo/audit.c index 3ffa4f5509d8..a51edfbe593b 100644 --- a/security/tomoyo/audit.c +++ b/security/tomoyo/audit.c @@ -156,7 +156,7 @@ static char *tomoyo_print_header(struct tomoyo_request_info *r) if (!buffer) return NULL; - tomoyo_convert_time(get_seconds(), &stamp); + tomoyo_convert_time(ktime_get_real_seconds(), &stamp); pos = snprintf(buffer, tomoyo_buffer_len - 1, "#%04u/%02u/%02u %02u:%02u:%02u# profile=%u mode=%s " diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c index e0fb75052550..c19970db89c4 100644 --- a/security/tomoyo/common.c +++ b/security/tomoyo/common.c @@ -2256,7 +2256,7 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = { /* Timestamp counter for last updated. */ static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; /* Counter for number of updates. */ -static unsigned int tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; +static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; /** * tomoyo_update_stat - Update statistic counters. @@ -2271,7 +2271,7 @@ void tomoyo_update_stat(const u8 index) * I don't use atomic operations because race condition is not fatal. */ tomoyo_stat_updated[index]++; - tomoyo_stat_modified[index] = get_seconds(); + tomoyo_stat_modified[index] = ktime_get_real_seconds(); } /** diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h index 361e7a284699..d9628d1635b2 100644 --- a/security/tomoyo/common.h +++ b/security/tomoyo/common.h @@ -1036,7 +1036,7 @@ void tomoyo_check_acl(struct tomoyo_request_info *r, bool (*check_entry) (struct tomoyo_request_info *, const struct tomoyo_acl_info *)); void tomoyo_check_profile(void); -void tomoyo_convert_time(time_t time, struct tomoyo_time *stamp); +void tomoyo_convert_time(time64_t time, struct tomoyo_time *stamp); void tomoyo_del_condition(struct list_head *element); void tomoyo_fill_path_info(struct tomoyo_path_info *ptr); void tomoyo_get_attributes(struct tomoyo_obj_info *obj); diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c index 848317fea704..db7a978ab4a4 100644 --- a/security/tomoyo/util.c +++ b/security/tomoyo/util.c @@ -86,38 +86,17 @@ const u8 tomoyo_index2category[TOMOYO_MAX_MAC_INDEX] = { * @stamp: Pointer to "struct tomoyo_time". * * Returns nothing. - * - * This function does not handle Y2038 problem. */ -void tomoyo_convert_time(time_t time, struct tomoyo_time *stamp) +void tomoyo_convert_time(time64_t time64, struct tomoyo_time *stamp) { - static const u16 tomoyo_eom[2][12] = { - { 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - { 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } - }; - u16 y; - u8 m; - bool r; - stamp->sec = time % 60; - time /= 60; - stamp->min = time % 60; - time /= 60; - stamp->hour = time % 24; - time /= 24; - for (y = 1970; ; y++) { - const unsigned short days = (y & 3) ? 365 : 366; - if (time < days) - break; - time -= days; - } - r = (y & 3) == 0; - for (m = 0; m < 11 && time >= tomoyo_eom[r][m]; m++) - ; - if (m) - time -= tomoyo_eom[r][m - 1]; - stamp->year = y; - stamp->month = ++m; - stamp->day = ++time; + struct tm tm; + time64_to_tm(time64, 0, &tm); + stamp->sec = tm.tm_sec; + stamp->min = tm.tm_min; + stamp->hour = tm.tm_hour; + stamp->day = tm.tm_mday; + stamp->month = tm.tm_mon + 1; + stamp->year = tm.tm_year - (1970 - 1900); } /**