From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by sourceware.org (Postfix) with ESMTPS id 547513858D29 for ; Mon, 15 Feb 2021 09:47:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 547513858D29 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4DfK5v3gNyz1qs0H; Mon, 15 Feb 2021 10:47:47 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4DfK5v2R1lz1qr73; Mon, 15 Feb 2021 10:47:47 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id SzrvtVc1h-yO; Mon, 15 Feb 2021 10:47:44 +0100 (CET) X-Auth-Info: iD0Ey3tfUGOAT6NR9IZxX+tSjgWoqi3At1Cjbqls8/w= Received: from jawa (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Mon, 15 Feb 2021 10:47:44 +0100 (CET) Date: Mon, 15 Feb 2021 10:47:43 +0100 From: Lukasz Majewski To: Joseph Myers , Adhemerval Zanella , Florian Weimer Cc: Paul Eggert , Alistair Francis , Arnd Bergmann , Alistair Francis , GNU C Library , Carlos O'Donell , Florian Weimer , Zack Weinberg Subject: Re: [PATCH v7] tst: time: Provide Y2038 tests for mktime (tst-mktime4.c) Message-ID: <20210215104743.30c65e26@jawa> In-Reply-To: <20210210223533.17457-1-lukma@denx.de> References: <20210210223533.17457-1-lukma@denx.de> Organization: denx.de X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; boundary="Sig_/DV99HvhPUUQLheaA1Q1ESFw"; protocol="application/pgp-signature" X-Spam-Status: No, score=-14.8 required=5.0 tests=BAYES_00, BIGNUM_EMAILS, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Feb 2021 09:47:50 -0000 --Sig_/DV99HvhPUUQLheaA1Q1ESFw Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Dear Community, > This change adds new test to assess mktime's functionality. >=20 > To be more specific - following use cases are checked: > - Pass struct tm as epoch time > - Pass struct tm as value just before Y2038 threshold (returned > value shall be 0x7FFFFFFF) > - Pass struct tm as the first value after Y2038 threshold > (expected value - 0x80000000) >=20 > --- > Changes for v2: > - Remove FAIL_UNSUPPORTED() when sizeof (time_t) <=3D 4 > - Remove tzset () as it is already done in mktime () > - Use TEST_COMPARE to check if correct result is received > - Use "TZ=3D:" glibc extension to guarantee UTC time zone > - Add two more checks - prepare struct tm in a way that mktime will > return 0xFFFFFFFF and 0x100000000 >=20 > Changes for v3: > - Remove .tm_wday and .tm_yday as are irrelevant > - Add (time_t) -1 cast when checking mktime return value > - Replace "executed" with "compiled". > - Use long long int as the exp_val type to avoid overflow compilation > error > - Rename tm1 to tm32bitmax > - Define tm0, tmY2038, tm32bitmax as const > - Pass the pointer to copy of aforementioned structs to > test_mktime_helper >=20 > Changes for v4: > - Use __builtin_add_overflow instead of sizeof (time_t) > 4 to check > if time_t has overflowed. >=20 > Changes for v5: > - Fix indentation of the struct tm > - Add more verbose error message when expected value is different han > result > - Add test prefix to commit message >=20 > Changes for v6: > - Add line parameter to test_mktime_helper() definition >=20 > Changes for v7: > - Replace FAIL_EXIT1 with FAIL_RET to not exit immediately after error > - Change signature of test_mktime_helper() function to return value Are there any more comments regarding this test? Is it eligible for pulling? > --- > time/Makefile | 2 +- > time/tst-mktime4.c | 109 > +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 > insertions(+), 1 deletion(-) create mode 100644 time/tst-mktime4.c >=20 > diff --git a/time/Makefile b/time/Makefile > index 7caec2b271..a52b6b94bc 100644 > --- a/time/Makefile > +++ b/time/Makefile > @@ -48,7 +48,7 @@ tests :=3D test_time clocktest tst-posixtz > tst-strptime tst_wcsftime \ tst-strptime3 bug-getdate1 > tst-strptime-whitespace tst-ftime \ tst-tzname tst-y2039 bug-mktime4 > tst-strftime2 tst-strftime3 \ tst-clock tst-clock2 > tst-clock_nanosleep tst-cpuclock1 \ > - tst-adjtime tst-ctime tst-difftime > + tst-adjtime tst-ctime tst-difftime tst-mktime4 > =20 > include ../Rules > =20 > diff --git a/time/tst-mktime4.c b/time/tst-mktime4.c > new file mode 100644 > index 0000000000..30c5f131e4 > --- /dev/null > +++ b/time/tst-mktime4.c > @@ -0,0 +1,109 @@ > +/* Test for mktime (4) > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be > useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > + > +const struct tm tm0 =3D > + { > + .tm_year =3D 70, > + .tm_mon =3D 0, > + .tm_mday =3D 1, > + .tm_hour =3D 0, > + .tm_min =3D 0, > + .tm_sec =3D 0, > + .tm_wday =3D 4, > + .tm_yday =3D 0, > + }; > + > +const struct tm tmY2038 =3D > + { > + .tm_year =3D 138, > + .tm_mon =3D 0, > + .tm_mday =3D 19, > + .tm_hour =3D 3, > + .tm_min =3D 14, > + .tm_sec =3D 7, > + }; > + > +const struct tm tm32bitmax =3D > + { > + .tm_year =3D 206, > + .tm_mon =3D 1, > + .tm_mday =3D 7, > + .tm_hour =3D 6, > + .tm_min =3D 28, > + .tm_sec =3D 15, > + }; > + > +static > +int test_mktime_helper (struct tm *tm, long long int exp_val, int > line) +{ > + time_t result, t; > + > + /* Check if we run on port with 32 bit time_t size */ > + if (__builtin_add_overflow (exp_val, 0, &t)) > + return 0; > + > + result =3D mktime (tm); > + if (result =3D=3D (time_t) -1) > + FAIL_RET ("*** mktime failed: %m in line: %d", line); > + > + if ((long long int) result !=3D exp_val) > + FAIL_RET ("*** Result different than expected (%lld !=3D %lld) in > %d\n", > + (long long int) result, exp_val, line); > + > + return 0; > +} > + > +static int > +do_test (void) > +{ > + struct tm t; > + /* Use glibc time zone extension "TZ=3D:" to to guarantee that UTC > + without leap seconds is used for the test. */ > + TEST_VERIFY_EXIT (setenv ("TZ", ":", 1) =3D=3D 0); > + > + /* Check that mktime (1970-01-01 00:00:00) returns 0. */ > + t =3D tm0; > + test_mktime_helper (&t, 0, __LINE__); > + > + /* Check that mktime (2038-01-19 03:14:07) returns 0x7FFFFFFF. */ > + t =3D tmY2038; > + test_mktime_helper (&t, 0x7fffffff, __LINE__); > + > + /* Check that mktime (2038-01-19 03:14:08) returns 0x80000000 > + (time_t overflow). */ > + t =3D tmY2038; > + t.tm_sec++; > + test_mktime_helper (&t, 0x80000000, __LINE__); > + > + /* Check that mktime (2106-02-07 06:28:15) returns 0xFFFFFFFF. */ > + t =3D tm32bitmax; > + test_mktime_helper (&t, 0xFFFFFFFF, __LINE__); > + > + /* Check that mktime (2106-02-07 06:28:16) returns 0x100000000. */ > + t =3D tm32bitmax; > + t.tm_sec++; > + test_mktime_helper (&t, 0x100000000, __LINE__); > + > + return 0; > +} > + > +#include Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de --Sig_/DV99HvhPUUQLheaA1Q1ESFw Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEgAyFJ+N6uu6+XupJAR8vZIA0zr0FAmAqQz8ACgkQAR8vZIA0 zr1acAgAr0qCTR+T/PTRIEyRPtsdaUSZWO1YixSZgWVHQIV6UTPSd49o5zIvgiUd sZXHy4xka2P0TU0zJmYt1PGoS+dl1y83INmsA0uFCEfsmFcGFUM/7nUv2JQXE7cJ p3DT/K93vStR8y6/f+gXIFy8SwqJaGG1NmMn+ZzZRPLDeSfLmvKwb75rWB5+PIYo k7YppLYPUo/SdJr3ImcHLRCeOnPbwUlFTkAJdjrBAIGL2lnH8NC3H12VrFOOGtG6 4K2VJUebVCtI+8QNmfp1+vgkOaJndox/l8TT3f58GfP8rtq3gjIgOuFWXnWuJHJ8 v/F2+z8dPQqEBCYH/8CfqOUanco/MA== =AtXh -----END PGP SIGNATURE----- --Sig_/DV99HvhPUUQLheaA1Q1ESFw--