From patchwork Wed Apr 10 06:45:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 88272 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F1FC93858401 for ; Wed, 10 Apr 2024 06:46:10 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 37FF23858416 for ; Wed, 10 Apr 2024 06:45:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 37FF23858416 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 37FF23858416 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731542; cv=none; b=Ahd5G+wAaffjjdVfDjiYPrz52VMERK/26ZsI7knTR+7HeW3tGuEtxNfqEpcUm1O9CHzWGfLindshxW9uUjKsKr52ykNYc+KCj96dfRl86kg1wKQxVBhDAHf6x4hJtNpBzTugKf3Rut76zauVvnP8DsX6Ce3aFYPKBDB4GoGaSmc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731542; c=relaxed/simple; bh=Io3/1mZZuPvD/N4FNaHb0C/6gpawgPdk5IpLvFU2yBs=; h=DKIM-Signature:From:To:Subject:Message-ID:Date:MIME-Version; b=j6g2Fw6NTwCVA43Al6oy9Cs+MW7xl7igcgGJt2vTuiFP1o9uYRf4uTTzEvk8tS3kwykzJX/rE+XcAbfCnCsiZAMJZLKW/UL3GOPxkYPL3Yo0gsRCqOcuvGn2fVYYVox9z9agaJRN6yfLIfKWbs1bEholV+nWkFFdOTvK0TMo6y0= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712731539; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=wot9gL4kA6M+aPBLR2znoqxs6KB3HkgGj9be48MmCtk=; b=BPcBtD8q01pFigFyONtU9Sl8n2FZVgmpbSsg/kx6yRuz4ZViVlTPLj+nfJw78zmPb4mCeF 79SQg3Rh9/FQru80zXpm7H0E/inUBJWZcnZGN1IQpvwDrAkSIu1rb5nwJvR4W5VGMmXy4R XbNGehdLh/6yTI7HW3q/l0maS7vsX/E= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-369-pniX0G1TPsG0sgbocoQLfg-1; Wed, 10 Apr 2024 02:45:37 -0400 X-MC-Unique: pniX0G1TPsG0sgbocoQLfg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A29C4188ACA1 for ; Wed, 10 Apr 2024 06:45:37 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.192.109]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DEAC340AE782 for ; Wed, 10 Apr 2024 06:45:36 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog In-Reply-To: Message-ID: <30fd9d14d3006367e02a65027a0b41cdf0ea62ae.1712731247.git.fweimer@redhat.com> References: X-From-Line: 30fd9d14d3006367e02a65027a0b41cdf0ea62ae Mon Sep 17 00:00:00 2001 Date: Wed, 10 Apr 2024 08:45:15 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org The default is for ports with a 64-bit time_t. Ports with a 32-bit time_t or with __WORDSIZE_TIME64_COMPAT32=1 need to override it. Reviewed-by: Adhemerval Zanella --- login/Makefile | 2 +- login/tst-utmp-size.c | 33 +++++++++++++++++++++++++++++++++ sysdeps/arc/utmp-size.h | 3 +++ sysdeps/arm/utmp-size.h | 2 ++ sysdeps/csky/utmp-size.h | 2 ++ sysdeps/generic/utmp-size.h | 23 +++++++++++++++++++++++ sysdeps/hppa/utmp-size.h | 2 ++ sysdeps/m68k/utmp-size.h | 3 +++ sysdeps/microblaze/utmp-size.h | 2 ++ sysdeps/mips/utmp-size.h | 2 ++ sysdeps/nios2/utmp-size.h | 2 ++ sysdeps/or1k/utmp-size.h | 3 +++ sysdeps/powerpc/utmp-size.h | 2 ++ sysdeps/riscv/utmp-size.h | 2 ++ sysdeps/sh/utmp-size.h | 2 ++ sysdeps/sparc/utmp-size.h | 2 ++ sysdeps/x86/utmp-size.h | 2 ++ 17 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 login/tst-utmp-size.c create mode 100644 sysdeps/arc/utmp-size.h create mode 100644 sysdeps/arm/utmp-size.h create mode 100644 sysdeps/csky/utmp-size.h create mode 100644 sysdeps/generic/utmp-size.h create mode 100644 sysdeps/hppa/utmp-size.h create mode 100644 sysdeps/m68k/utmp-size.h create mode 100644 sysdeps/microblaze/utmp-size.h create mode 100644 sysdeps/mips/utmp-size.h create mode 100644 sysdeps/nios2/utmp-size.h create mode 100644 sysdeps/or1k/utmp-size.h create mode 100644 sysdeps/powerpc/utmp-size.h create mode 100644 sysdeps/riscv/utmp-size.h create mode 100644 sysdeps/sh/utmp-size.h create mode 100644 sysdeps/sparc/utmp-size.h create mode 100644 sysdeps/x86/utmp-size.h diff --git a/login/Makefile b/login/Makefile index 1e22008a61..b26ac42bfc 100644 --- a/login/Makefile +++ b/login/Makefile @@ -44,7 +44,7 @@ subdir-dirs = programs vpath %.c programs tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \ - tst-pututxline-lockfail tst-pututxline-cache + tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size # Empty compatibility library for old binaries. extra-libs := libutil diff --git a/login/tst-utmp-size.c b/login/tst-utmp-size.c new file mode 100644 index 0000000000..1b7f7ff042 --- /dev/null +++ b/login/tst-utmp-size.c @@ -0,0 +1,33 @@ +/* Check expected sizes of struct utmp, struct utmpx, struct lastlog. + Copyright (C) 2024 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 + +static int +do_test (void) +{ + _Static_assert (sizeof (struct utmp) == UTMP_SIZE, "struct utmp size"); + _Static_assert (sizeof (struct utmpx) == UTMP_SIZE, "struct utmpx size"); + _Static_assert (sizeof (struct lastlog) == LASTLOG_SIZE, + "struct lastlog size"); + return 0; +} + +#include diff --git a/sysdeps/arc/utmp-size.h b/sysdeps/arc/utmp-size.h new file mode 100644 index 0000000000..a247fcd3da --- /dev/null +++ b/sysdeps/arc/utmp-size.h @@ -0,0 +1,3 @@ +/* arc has less padding than other architectures with 64-bit time_t. */ +#define UTMP_SIZE 392 +#define LASTLOG_SIZE 296 diff --git a/sysdeps/arm/utmp-size.h b/sysdeps/arm/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/arm/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/csky/utmp-size.h b/sysdeps/csky/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/csky/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/generic/utmp-size.h b/sysdeps/generic/utmp-size.h new file mode 100644 index 0000000000..89dbe878b0 --- /dev/null +++ b/sysdeps/generic/utmp-size.h @@ -0,0 +1,23 @@ +/* Expected sizes of utmp-related structures stored in files. 64-bit version. + Copyright (C) 2024 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 + . */ + +/* Expected size, in bytes, of struct utmp and struct utmpx. */ +#define UTMP_SIZE 400 + +/* Expected size, in bytes, of struct lastlog. */ +#define LASTLOG_SIZE 296 diff --git a/sysdeps/hppa/utmp-size.h b/sysdeps/hppa/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/hppa/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/m68k/utmp-size.h b/sysdeps/m68k/utmp-size.h new file mode 100644 index 0000000000..5946685819 --- /dev/null +++ b/sysdeps/m68k/utmp-size.h @@ -0,0 +1,3 @@ +/* m68k has 2-byte alignment. */ +#define UTMP_SIZE 382 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/microblaze/utmp-size.h b/sysdeps/microblaze/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/microblaze/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/mips/utmp-size.h b/sysdeps/mips/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/mips/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/nios2/utmp-size.h b/sysdeps/nios2/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/nios2/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/or1k/utmp-size.h b/sysdeps/or1k/utmp-size.h new file mode 100644 index 0000000000..6b3653aa4d --- /dev/null +++ b/sysdeps/or1k/utmp-size.h @@ -0,0 +1,3 @@ +/* or1k has less padding than other architectures with 64-bit time_t. */ +#define UTMP_SIZE 392 +#define LASTLOG_SIZE 296 diff --git a/sysdeps/powerpc/utmp-size.h b/sysdeps/powerpc/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/powerpc/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/riscv/utmp-size.h b/sysdeps/riscv/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/riscv/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/sh/utmp-size.h b/sysdeps/sh/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/sh/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/sparc/utmp-size.h b/sysdeps/sparc/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/sparc/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 diff --git a/sysdeps/x86/utmp-size.h b/sysdeps/x86/utmp-size.h new file mode 100644 index 0000000000..8f21ebe1b6 --- /dev/null +++ b/sysdeps/x86/utmp-size.h @@ -0,0 +1,2 @@ +#define UTMP_SIZE 384 +#define LASTLOG_SIZE 292 From patchwork Wed Apr 10 06:45:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 88273 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0A2E13858C56 for ; Wed, 10 Apr 2024 06:46:21 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id C3CA03858415 for ; Wed, 10 Apr 2024 06:45:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C3CA03858415 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C3CA03858415 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731554; cv=none; b=opwuYlmOUGTkrMTL5d/wBkTGycCjbnIH0Xpbwue17krj5MHYnyqPAEeWs01nL8OLwMzYumeaA9pLPU8vpF+FWwQBO+6F7jvxv9fMLEIp3Q7+EwVC+FEolx1kkbEUp3KzLNr6C6ZJdNSc0ZECdeG3NbP/TYVuMx711KFw5udjf8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731554; c=relaxed/simple; bh=oU1u13AbioTdNHIuwSzPZzlFVy4vJ3p5cJzMTSdIuaw=; h=DKIM-Signature:From:To:Subject:Message-ID:Date:MIME-Version; b=jJvlUwysVoNv7G51J9zUgdiNDGRORYzVVxsAsr6JRrBmdhBPE5soJjwlyV0IakpQAs1i13DhkhN+R01puEuk2FeRGuwQZHK4sRIknkgH3QhkHsJrr9ZUA8EKQKW9UDvTm82eR5uHMqm+N7uivrx2PAybo5AhgLdKaWtUH0auIbE= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712731547; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Hlyvy68EDMWWISDC3ZAUHAnd2vgqIru06hNZfSfd0IM=; b=aAU+EBWGWzolinrjfEqtkO69E5GPZV4XzdHw+ls713oaPV0KaTxMjU7hWa1nAv3JUjjGIi GHv+DNMUnqsS45bBlL+tSRy687qFaFsOhbkZylaeg+gySILGA1PGSCaaNmpPYTTUerN8jc 1Y5dan48+n3wxdNl1Os1qMCrROJfO3g= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-22-faeziypnPHGRNFAdee1QqQ-1; Wed, 10 Apr 2024 02:45:45 -0400 X-MC-Unique: faeziypnPHGRNFAdee1QqQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B3E1C3800096 for ; Wed, 10 Apr 2024 06:45:45 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.192.109]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9B03D1C0F148 for ; Wed, 10 Apr 2024 06:45:44 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) In-Reply-To: Message-ID: References: X-From-Line: ceb6950bb33af399460f48ea06214dd721e1b8b7 Mon Sep 17 00:00:00 2001 Date: Wed, 10 Apr 2024 08:45:39 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org These structs describe file formats under /var/log, and should not depend on the definition of _TIME_BITS. This is achieved by defining __WORDSIZE_TIME64_COMPAT32 to 1 on 32-bit ports that support 32-bit time_t values (where __time_t is 32 bits). Reviewed-by: Adhemerval Zanella --- bits/wordsize.h | 6 ++++-- login/Makefile | 4 +++- login/tst-utmp-size-64.c | 2 ++ sysdeps/arm/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/csky/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/m68k/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/microblaze/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/mips/bits/wordsize.h | 6 +----- sysdeps/nios2/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/powerpc/powerpc32/bits/wordsize.h | 3 +-- sysdeps/powerpc/powerpc64/bits/wordsize.h | 3 +-- sysdeps/sh/bits/wordsize.h | 21 +++++++++++++++++++ sysdeps/sparc/sparc32/bits/wordsize.h | 2 +- sysdeps/sparc/sparc64/bits/wordsize.h | 3 +-- sysdeps/unix/sysv/linux/hppa/bits/wordsize.h | 21 +++++++++++++++++++ .../unix/sysv/linux/powerpc/bits/wordsize.h | 3 +-- sysdeps/unix/sysv/linux/sparc/bits/wordsize.h | 3 +-- sysdeps/x86/bits/wordsize.h | 5 ++--- 18 files changed, 165 insertions(+), 22 deletions(-) create mode 100644 login/tst-utmp-size-64.c create mode 100644 sysdeps/arm/bits/wordsize.h create mode 100644 sysdeps/csky/bits/wordsize.h create mode 100644 sysdeps/m68k/bits/wordsize.h create mode 100644 sysdeps/microblaze/bits/wordsize.h create mode 100644 sysdeps/nios2/bits/wordsize.h create mode 100644 sysdeps/sh/bits/wordsize.h create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h diff --git a/bits/wordsize.h b/bits/wordsize.h index 14edae3a11..53013a9275 100644 --- a/bits/wordsize.h +++ b/bits/wordsize.h @@ -21,7 +21,9 @@ #define __WORDSIZE32_PTRDIFF_LONG /* Set to 1 in order to force time types to be 32 bits instead of 64 bits in - struct lastlog and struct utmp{,x} on 64-bit ports. This may be done in + struct lastlog and struct utmp{,x}. This may be done in order to make 64-bit ports compatible with 32-bit ports. Set to 0 for - 64-bit ports where the time types are 64-bits or for any 32-bit ports. */ + 64-bit ports where the time types are 64-bits and new 32-bit ports + where time_t is 64 bits, and there is no companion architecture with + 32-bit time_t. */ #define __WORDSIZE_TIME64_COMPAT32 diff --git a/login/Makefile b/login/Makefile index b26ac42bfc..f91190e3dc 100644 --- a/login/Makefile +++ b/login/Makefile @@ -44,7 +44,9 @@ subdir-dirs = programs vpath %.c programs tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \ - tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size + tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 + +CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 # Empty compatibility library for old binaries. extra-libs := libutil diff --git a/login/tst-utmp-size-64.c b/login/tst-utmp-size-64.c new file mode 100644 index 0000000000..7a581a4c12 --- /dev/null +++ b/login/tst-utmp-size-64.c @@ -0,0 +1,2 @@ +/* The on-disk layout must not change in time64 mode. */ +#include "tst-utmp-size.c" diff --git a/sysdeps/arm/bits/wordsize.h b/sysdeps/arm/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/arm/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/csky/bits/wordsize.h b/sysdeps/csky/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/csky/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/m68k/bits/wordsize.h b/sysdeps/m68k/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/m68k/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/microblaze/bits/wordsize.h b/sysdeps/microblaze/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/microblaze/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/mips/bits/wordsize.h b/sysdeps/mips/bits/wordsize.h index 57f0f2a22f..30dd3fd85d 100644 --- a/sysdeps/mips/bits/wordsize.h +++ b/sysdeps/mips/bits/wordsize.h @@ -19,11 +19,7 @@ #define __WORDSIZE _MIPS_SZPTR -#if _MIPS_SIM == _ABI64 -# define __WORDSIZE_TIME64_COMPAT32 1 -#else -# define __WORDSIZE_TIME64_COMPAT32 0 -#endif +#define __WORDSIZE_TIME64_COMPAT32 1 #if __WORDSIZE == 32 #define __WORDSIZE32_SIZE_ULONG 0 diff --git a/sysdeps/nios2/bits/wordsize.h b/sysdeps/nios2/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/nios2/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/powerpc/powerpc32/bits/wordsize.h b/sysdeps/powerpc/powerpc32/bits/wordsize.h index 04ca9debf0..6993fb6b29 100644 --- a/sysdeps/powerpc/powerpc32/bits/wordsize.h +++ b/sysdeps/powerpc/powerpc32/bits/wordsize.h @@ -2,10 +2,9 @@ #if defined __powerpc64__ # define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 #else # define __WORDSIZE 32 -# define __WORDSIZE_TIME64_COMPAT32 0 # define __WORDSIZE32_SIZE_ULONG 0 # define __WORDSIZE32_PTRDIFF_LONG 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 diff --git a/sysdeps/powerpc/powerpc64/bits/wordsize.h b/sysdeps/powerpc/powerpc64/bits/wordsize.h index 04ca9debf0..6993fb6b29 100644 --- a/sysdeps/powerpc/powerpc64/bits/wordsize.h +++ b/sysdeps/powerpc/powerpc64/bits/wordsize.h @@ -2,10 +2,9 @@ #if defined __powerpc64__ # define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 #else # define __WORDSIZE 32 -# define __WORDSIZE_TIME64_COMPAT32 0 # define __WORDSIZE32_SIZE_ULONG 0 # define __WORDSIZE32_PTRDIFF_LONG 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 diff --git a/sysdeps/sh/bits/wordsize.h b/sysdeps/sh/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/sh/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/sparc/sparc32/bits/wordsize.h b/sysdeps/sparc/sparc32/bits/wordsize.h index 4bbd2e63b4..a2e79e0fa9 100644 --- a/sysdeps/sparc/sparc32/bits/wordsize.h +++ b/sysdeps/sparc/sparc32/bits/wordsize.h @@ -1,6 +1,6 @@ /* Determine the wordsize from the preprocessor defines. */ #define __WORDSIZE 32 -#define __WORDSIZE_TIME64_COMPAT32 0 +#define __WORDSIZE_TIME64_COMPAT32 1 #define __WORDSIZE32_SIZE_ULONG 0 #define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/sparc/sparc64/bits/wordsize.h b/sysdeps/sparc/sparc64/bits/wordsize.h index 2f66f10d72..ea103e5970 100644 --- a/sysdeps/sparc/sparc64/bits/wordsize.h +++ b/sysdeps/sparc/sparc64/bits/wordsize.h @@ -2,10 +2,9 @@ #if defined __arch64__ || defined __sparcv9 # define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 #else # define __WORDSIZE 32 -# define __WORDSIZE_TIME64_COMPAT32 0 # define __WORDSIZE32_SIZE_ULONG 0 # define __WORDSIZE32_PTRDIFF_LONG 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 diff --git a/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h new file mode 100644 index 0000000000..6ecbfe7c86 --- /dev/null +++ b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1999-2024 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 + . */ + +#define __WORDSIZE 32 +#define __WORDSIZE_TIME64_COMPAT32 1 +#define __WORDSIZE32_SIZE_ULONG 0 +#define __WORDSIZE32_PTRDIFF_LONG 0 diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h index 04ca9debf0..6993fb6b29 100644 --- a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h +++ b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h @@ -2,10 +2,9 @@ #if defined __powerpc64__ # define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 #else # define __WORDSIZE 32 -# define __WORDSIZE_TIME64_COMPAT32 0 # define __WORDSIZE32_SIZE_ULONG 0 # define __WORDSIZE32_PTRDIFF_LONG 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 diff --git a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h index 7562875ee2..ea103e5970 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h @@ -2,10 +2,9 @@ #if defined __arch64__ || defined __sparcv9 # define __WORDSIZE 64 -# define __WORDSIZE_TIME64_COMPAT32 1 #else # define __WORDSIZE 32 # define __WORDSIZE32_SIZE_ULONG 0 # define __WORDSIZE32_PTRDIFF_LONG 0 -# define __WORDSIZE_TIME64_COMPAT32 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h index 70f652bca1..3f40aa76f9 100644 --- a/sysdeps/x86/bits/wordsize.h +++ b/sysdeps/x86/bits/wordsize.h @@ -8,10 +8,9 @@ #define __WORDSIZE32_PTRDIFF_LONG 0 #endif +#define __WORDSIZE_TIME64_COMPAT32 1 + #ifdef __x86_64__ -# define __WORDSIZE_TIME64_COMPAT32 1 /* Both x86-64 and x32 use the 64-bit system call interface. */ # define __SYSCALL_WORDSIZE 64 -#else -# define __WORDSIZE_TIME64_COMPAT32 0 #endif From patchwork Wed Apr 10 06:45:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 88274 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 709953858401 for ; Wed, 10 Apr 2024 06:46:54 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id A79BB3858CDB for ; Wed, 10 Apr 2024 06:45:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A79BB3858CDB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A79BB3858CDB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731560; cv=none; b=BPTxJu5C5JAddnBESxg57GbVZZFuJXV0nv53/3CgFVx+TYBST7Yb7SzP+b3rhAMPtPohji2qjzW4VM2/0s0SvFcaJKVpVeAM9XC8zFzS4Lw6kD3p4QUsT7gDKsNtX38d3a/3uiFGEDuoTXLWdqQiIzxbBiZ4bVjlRW4SiAhOIJI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712731560; c=relaxed/simple; bh=XwbIY2A1Ij98xEYhEd8BYU19/uyGSjNRxaUyvpjjC1Q=; h=DKIM-Signature:From:To:Subject:Message-ID:Date:MIME-Version; b=OsNVsGcvr1yyw+NgtWy5kUDlBzeRxfbEvlIkBJithJdk1tqc88XtPzlR0uxXKi8sajbpYSh3SL2XuVkngt75wUuKHEE/Hc4wJ5IvVej+jZYRm3RzSL+dEfC1NmOfocc4MRGDgueoQJyqIZQOISnhyEATXM+jSr4yzdjpNij9g4w= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712731558; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=22x+Rk/LPnyBSwvLQwDLMUWhrQLbGT+7LnlVvqrjs/k=; b=R5Fc7weLb5RRWyVLp1yAA3wVS0S4XZaSRGhKJRLJjIWMmeOATOCMKVB70fwR/htV6lYRS0 qAcp3/SSnQlgrpjaCzLIrA40g49KTxnvXl5W+EQoXokvFMJW0PlP8iaPx8XDyqVBzDL4Be wA+uGkup/VpUwzLvbzhuU3dsluJjOkw= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-63-1fMF00PYPH6HIOorNcmliA-1; Wed, 10 Apr 2024 02:45:56 -0400 X-MC-Unique: 1fMF00PYPH6HIOorNcmliA-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 47F3829AA3B2 for ; Wed, 10 Apr 2024 06:45:56 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.192.109]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 882074867A3 for ; Wed, 10 Apr 2024 06:45:55 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch In-Reply-To: Message-ID: References: X-From-Line: dcd1cb663536fbcdbb9597060045500a027053ca Mon Sep 17 00:00:00 2001 Date: Wed, 10 Apr 2024 08:45:49 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.10 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org These fields store timestamps when the system was running. No Linux systems existed before 1970, so these values are unused. Switching to unsigned types allows continued use of the existing struct layouts beyond the year 2038. The intent is to give distributions more time to switch to improved interfaces that also avoid locking/data corruption issues. Reviewed-by: Adhemerval Zanella --- NEWS | 9 +++++++- bits/utmp.h | 4 ++-- login/Makefile | 4 +++- login/tst-utmp-unsigned-64.c | 1 + login/tst-utmp-unsigned.c | 40 ++++++++++++++++++++++++++++++++++++ sysdeps/gnu/bits/utmpx.h | 2 +- 6 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 login/tst-utmp-unsigned-64.c create mode 100644 login/tst-utmp-unsigned.c diff --git a/NEWS b/NEWS index da4b2223e9..cf6078cf20 100644 --- a/NEWS +++ b/NEWS @@ -28,7 +28,14 @@ Major new features: Deprecated and removed features, and other changes affecting compatibility: - [Add deprecations, removals and changes affecting compatibility here] +* Architectures which use a 32-bit seconds-since-epoch field in struct + lastlog, struct utmp, struct utmpx (such as i386, powerpc64le, rv32, + rv64, x86-64) switched from a signed to an unsigned type for that + field. This allows these fields to store timestamps beyond the year + 2038, until the year 2106. Please note that applications are still + expected to migrate off the interfaces declared in and + (except for login_tty) due to locking and session management + problems. Changes to build and runtime requirements: diff --git a/bits/utmp.h b/bits/utmp.h index f2d1c13d8c..27cb536800 100644 --- a/bits/utmp.h +++ b/bits/utmp.h @@ -36,7 +36,7 @@ struct lastlog { #if __WORDSIZE_TIME64_COMPAT32 - int32_t ll_time; + __uint32_t ll_time; #else __time_t ll_time; #endif @@ -76,7 +76,7 @@ struct utmp int32_t ut_session; /* Session ID, used for windowing. */ struct { - int32_t tv_sec; /* Seconds. */ + __uint32_t tv_sec; /* Seconds. */ int32_t tv_usec; /* Microseconds. */ } ut_tv; /* Time entry was made. */ #else diff --git a/login/Makefile b/login/Makefile index f91190e3dc..84563230ef 100644 --- a/login/Makefile +++ b/login/Makefile @@ -44,9 +44,11 @@ subdir-dirs = programs vpath %.c programs tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \ - tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 + tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 \ + tst-utmp-unsigned tst-utmp-unsigned-64 CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 +CFLAGS-tst-utmp-unsigned-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 # Empty compatibility library for old binaries. extra-libs := libutil diff --git a/login/tst-utmp-unsigned-64.c b/login/tst-utmp-unsigned-64.c new file mode 100644 index 0000000000..940e7654f8 --- /dev/null +++ b/login/tst-utmp-unsigned-64.c @@ -0,0 +1 @@ +#include "tst-utmp-unsigned.c" diff --git a/login/tst-utmp-unsigned.c b/login/tst-utmp-unsigned.c new file mode 100644 index 0000000000..27ad03a7d6 --- /dev/null +++ b/login/tst-utmp-unsigned.c @@ -0,0 +1,40 @@ +/* Check that struct utmp, struct utmpx, struct lastlog use unsigned epoch. + Copyright (C) 2024 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 + +/* Undefined. Used to check that the conditions below are optimized away. */ +void link_failure_utmp (void); +void link_failure_utmpx (void); +void link_failure_lastlog (void); + +static int +do_test (void) +{ + if ((struct utmp) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0) + link_failure_utmp (); + if ((struct utmpx) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0) + link_failure_utmpx (); + if ((struct lastlog) { .ll_time = 0x80000000U, }.ll_time <= 0) + link_failure_lastlog (); + return 0; +} + +#include diff --git a/sysdeps/gnu/bits/utmpx.h b/sysdeps/gnu/bits/utmpx.h index 34b4afbc6a..ed0df9bd81 100644 --- a/sysdeps/gnu/bits/utmpx.h +++ b/sysdeps/gnu/bits/utmpx.h @@ -74,7 +74,7 @@ struct utmpx __int32_t ut_session; /* Session ID, used for windowing. */ struct { - __int32_t tv_sec; /* Seconds. */ + __uint32_t tv_sec; /* Seconds. */ __int32_t tv_usec; /* Microseconds. */ } ut_tv; /* Time entry was made. */ #else