From patchwork Thu Oct 19 12:29:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 116393 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp437064qgn; Thu, 19 Oct 2017 05:29:52 -0700 (PDT) X-Google-Smtp-Source: ABhQp+T92tBOxuBHvmDzBLt315Zi0JLwb2PRVNvqYSmXJQvT/BxFiOJzZB/nn5lNZa9ULhfED9e4 X-Received: by 10.98.147.73 with SMTP id b70mr1376837pfe.347.1508416192148; Thu, 19 Oct 2017 05:29:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508416192; cv=none; d=google.com; s=arc-20160816; b=HQnVPx/Z7UEKBR6QuPGILxifupGT2NRHaVBbw8SkzaybPFrSXwUdsB/zo7Wz3EbzFT omAG3ztbmwOUshjV3RFjbKdxwJLq9mNJGrEkBWQ+FjaPgZMaM+dCl0QTy2V1XqxmtVJT ENhD4pvGgPOrynXfZGQ+UODCaZtk3hAtfL8JVMVkA8/8xHGlZ64OiIy3NcJnMm09YeNM xi3yYmozOXOpgvqio5qBNF1VlYek3gsKgd8oMAS/YAl2F06rIKjtXx5Ai5bewSa+qosS SrKTZcYda6mcR0ZBc32Vi5hpThLhtXCv2pnTwUDo544qJO+1O/xuZF0nJqBQTfNsPlfb NxaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=s3Srsk/AYuXRoytMtlt7/yTkjulPu1vFNPnRtBNe7Wo=; b=rCgcJgJgQi1pLHeakTFpgqhKrcbVW3APtBCB+iHHjQqptFeu5+r1T499O1riDxk6LJ D4dzRdoZnk7Rv+7hzrzdMhqKE+UHXJlH5O3TSnxwCSPM6H1gNINYZcXB022F1ZLb/YmF ttk6M+SYsUagdKNuVyF/05Enk33QUjFFj7b3eq1v9EKyZA4ybU92V0OjHFlCfW+V4Kib V4KguAPpQaDIV+7aApVnniQsUrvOegk0Ed+y6maRZeH40kwpfmeIhSfDFOT+VKOk2IGA PUZk5tz5qZ5TVj41TcvlIEpGdUj3OXIFTH71n407uQCxxW8Z0R+SwNyFWpgAwSqvgXqZ yLeQ== 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 j125si5730648pfg.171.2017.10.19.05.29.51; Thu, 19 Oct 2017 05:29:52 -0700 (PDT) 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 S1752053AbdJSM3s (ORCPT + 27 others); Thu, 19 Oct 2017 08:29:48 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:59154 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751352AbdJSM3r (ORCPT ); Thu, 19 Oct 2017 08:29:47 -0400 Received: from wuerfel.lan ([46.223.139.202]) by mrelayeu.kundenserver.de (mreue103 [212.227.15.145]) with ESMTPA (Nemesis) id 0MWPgw-1dhaQA0jFa-00XdCo; Thu, 19 Oct 2017 14:29:24 +0200 From: Arnd Bergmann To: Kentaro Takeda , Tetsuo Handa , James Morris , "Serge E. Hallyn" Cc: Arnd Bergmann , Ingo Molnar , linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] [v2] tomoyo: fix timestamping for y2038 Date: Thu, 19 Oct 2017 14:29:04 +0200 Message-Id: <20171019122919.1263808-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:KkBLnkB3hLOY357LehR+lDiyzt7zQwQdlMQ6zR3VeeD3QIq4cq5 uBanbiRuZD0+w9K/wEQ60S35bd0eDdafoC0z126W4VG8g+otXFuLoHMuWySZDeeFbKRgDAI G1ug+scIH/fKJyElAXtFppP66jOjYIcC22Y2aAmntchVftDqTq/cGTbBveiKE9OgEZdXrsk F+9vp9qSKIF9h+BpiPIAw== X-UI-Out-Filterresults: notjunk:1; V01:K0:AFLeATyMWcQ=:VnQYFEBQFiO9k5WQ9COssI xRCrAMNG2NL1mErGBLetAoTdKk4UYr6EoW8m7eXzrGUIkuJJccHiVQbDYCkhWy5e9qeeNoJeR I94W84n/qLXngqdgSLrLK+ai3p8Wra1hy3Y4waMlVYnJ4/in3VFxFl/APkWg2/E0QRRAj0NBA WbUzsMCLGCuTnmiFvgg/MYyuNcHWojifHpWWxTloIJ8imznPE4jimZXvBuPPT94rUve26VvZS nbA0a58cs9H0p60l8PQx6fo6W8mwsJ+c5o7x2IVvEfg0eFJSy4/Sb+D9T//+DccqxBUG9H1F0 7tvtehpo1aHaerzkZUBn7yTIB9j5VjYXx0q6Im4loYtJyAnVVeXI4i4Q+LI8BdpQ5VFoupcbQ bblWVSF+YNNw3SX2Tf41gJjg8JYVvQzKv4jbRt6gZ5omw2rdk/UcbAdNi4ToELTQBGrgmf0fE lU6LSV7dUw4XhXWtw69sNUcTutE6cwQvFiDERrXLrdBLdKDKxSi1Ipey4e4eVS9AsxJb4x6d0 ClfCBI4vuvHUxO3eTicrhU5VmRd9tz6PF+/c7AiQn4/DpwVOLzedWhVVeOVFsgwq9geAwjGim tlDjxUgHzX54NmMgqpk3fUVvo2eHJ107SZi7XtzcyBCFSObKacA4e1pNTPjE56yt9nR1g4jC2 YNwzdOaONngw/WqbHyiEOUIdq/Lk3JInZ/ngw39aPc6KG9ruelAdNxqGWcp0g0QGHBOunxYIH lCTh55/TFmipPi/Nd8tt03b5QdVcQ6ul8hmJWA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Acked-by: Tetsuo Handa Signed-off-by: Arnd Bergmann --- v2: fix year calculation --- 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(-) -- 2.9.0 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..cac431d381d2 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 + 1900; } /**