From patchwork Thu Jun 8 10:16:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Sekletar X-Patchwork-Id: 13271888 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 233B5C7EE25 for ; Thu, 8 Jun 2023 10:17:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233991AbjFHKR0 (ORCPT ); Thu, 8 Jun 2023 06:17:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39134 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234174AbjFHKRZ (ORCPT ); Thu, 8 Jun 2023 06:17:25 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1D811FFA for ; Thu, 8 Jun 2023 03:16:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1686219399; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xYCw3I4nWr1p+lEe4qR80qwR+LhJGCUxY2FlsUOhHns=; b=TaS/yqanJbPbe4mRWobdIxOEiyhnO80LNH3IS6mPXJj3x/d0thz6MYDTuENKjYV9QqxcCB CUdztk4YdI0x2XGe5ehjbCrGc6WvUqo4FML4YhSrFPJOls8il9GtZe7dTTOWkLwoEX1RYf HchJzq/u12PkXj2tjvCr2nYNEb4C/wU= Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-298-gWMG7paoO4-vsBL_po4Fpg-1; Thu, 08 Jun 2023 06:16:38 -0400 X-MC-Unique: gWMG7paoO4-vsBL_po4Fpg-1 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-977d4b0d9e3so47507266b.0 for ; Thu, 08 Jun 2023 03:16:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686219397; x=1688811397; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xYCw3I4nWr1p+lEe4qR80qwR+LhJGCUxY2FlsUOhHns=; b=KsYtJct/MPg18bPlbpeGVarsomVbTYzEDKC8tGrR9fakKKila/8cIOzonDAc/WRGjq Kav9wKf/XisEM2Cg4tWG+khMV9PeCrT6aChbQun66b/7jpK5fvKmJStevcR8zjB28VUw Zj4uMplv34FAdJuvQPWxfVFBPOSfI6o/TpETUzFl5ySM+qraB4g1OxFmfPhDn3xOnQFG IocuYITAbVbju81AnVBmAJvhK4xjmJTn6S5pXQHJ6af6F5JF3cgoU3DT60XOUPYpIV/9 QV7+2ce9kIKl4rXI43CHZcJpIc/KekYg6V8rb872HYDV0eDlUrAUeS4j0BmvQqXyiRCx 1dmw== X-Gm-Message-State: AC+VfDz/2KmkfEiv2y0lMhX6xITlczmsNihMvpujZOBocn5mhD70YJ8U iqdmCPujII9qiRT+bgXJZ2FDkzLCAOtu7bXudrD2aA1jOHp9JItmZipN7ZKGMkg3V6Ug5FopRMC XVBi4hPmkNTgXnr1jRgM3umttGMfd X-Received: by 2002:a17:906:4fcd:b0:978:9ad7:e736 with SMTP id i13-20020a1709064fcd00b009789ad7e736mr1906684ejw.39.1686219396853; Thu, 08 Jun 2023 03:16:36 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6FwyrOWXKjHsDINcg4QuGkxMlJ+8bPC1MM3qHtDfay7aIVDCD3WI28XJhe+u0atwcZ/NErNA== X-Received: by 2002:a17:906:4fcd:b0:978:9ad7:e736 with SMTP id i13-20020a1709064fcd00b009789ad7e736mr1906661ejw.39.1686219396526; Thu, 08 Jun 2023 03:16:36 -0700 (PDT) Received: from localhost.localdomain ([46.33.96.32]) by smtp.gmail.com with ESMTPSA id e20-20020a170906249400b00977da0f14ffsm506558ejb.171.2023.06.08.03.16.35 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 08 Jun 2023 03:16:35 -0700 (PDT) From: Michal Sekletar To: jirislaby@kernel.org Cc: arozansk@redhat.com, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, msekleta@redhat.com, shuah@kernel.org Subject: [PATCH v2 1/2] tty: tty_io: update timestamps on all device nodes Date: Thu, 8 Jun 2023 12:16:15 +0200 Message-Id: <20230608101616.44152-1-msekleta@redhat.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org User space applications watch for timestamp changes on character device files in order to determine idle time of a given terminal session. For example, "w" program uses this information to populate the IDLE column of its output [1]. Similarly, systemd-logind has optional feature where it uses atime of the tty character device to determine if there was activity on the terminal associated with the logind's session object. If there was no activity for a configured period of time then logind will terminate such session [2]. Now, usually (e.g. bash running on the terminal) the use of the terminal will update timestamps (atime and mtime) on the corresponding terminal character device. However, if access to the terminal, e.g. /dev/pts/0, is performed through magic character device /dev/tty then such access obviously changes the state of the terminal, however timestamps on the device that correspond to the terminal (/dev/pts/0) are not updated. This patch makes sure that we update timestamps on *all* character devices that correspond to the given tty, because outside observers (w, systemd-logind) are maybe checking these timestamps. Obviously, they can not check timestamps on /dev/tty as that has per-process meaning. [1] https://gitlab.com/procps-ng/procps/-/blob/v4.0.0/w.c#L286 [2] https://github.com/systemd/systemd/blob/v252/NEWS#L477 Signed-off-by: Michal Sekletar --- v1 -> v2: Minor style tweaks based on code review comments drivers/tty/tty_io.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index c84be40fb..a505d2c49 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -101,6 +101,7 @@ #include #include #include +#include #include #include @@ -811,18 +812,26 @@ void start_tty(struct tty_struct *tty) } EXPORT_SYMBOL(start_tty); -static void tty_update_time(struct timespec64 *time) +static void tty_update_time(struct tty_struct *tty, bool mtime) { time64_t sec = ktime_get_real_seconds(); + struct tty_file_private *priv; - /* - * We only care if the two values differ in anything other than the - * lower three bits (i.e every 8 seconds). If so, then we can update - * the time of the tty device, otherwise it could be construded as a - * security leak to let userspace know the exact timing of the tty. - */ - if ((sec ^ time->tv_sec) & ~7) - time->tv_sec = sec; + spin_lock(&tty->files_lock); + list_for_each_entry(priv, &tty->tty_files, list) { + struct inode *inode = file_inode(priv->file); + struct timespec64 *time = mtime ? &inode->i_mtime : &inode->i_atime; + + /* + * We only care if the two values differ in anything other than the + * lower three bits (i.e every 8 seconds). If so, then we can update + * the time of the tty device, otherwise it could be construded as a + * security leak to let userspace know the exact timing of the tty. + */ + if ((sec ^ time->tv_sec) & ~7) + time->tv_sec = sec; + } + spin_unlock(&tty->files_lock); } /* @@ -928,7 +937,7 @@ static ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to) tty_ldisc_deref(ld); if (i > 0) - tty_update_time(&inode->i_atime); + tty_update_time(tty, false); return i; } @@ -1036,7 +1045,7 @@ static inline ssize_t do_tty_write( cond_resched(); } if (written) { - tty_update_time(&file_inode(file)->i_mtime); + tty_update_time(tty, true); ret = written; } out: From patchwork Thu Jun 8 10:16:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Sekletar X-Patchwork-Id: 13271889 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2F1F7C7EE25 for ; Thu, 8 Jun 2023 10:17:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235067AbjFHKRp (ORCPT ); Thu, 8 Jun 2023 06:17:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235865AbjFHKRo (ORCPT ); Thu, 8 Jun 2023 06:17:44 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8019F2D48 for ; Thu, 8 Jun 2023 03:16:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1686219413; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CkSBFkEaQ4x9rH0bVltqMnMT5xLInhrDlt72mpqM2uM=; b=I9eLixnDdWG76UH1zGyFZgDRWIwtkrI6lLfsqGUShGctJlOLo9cKc219XQZauZV0AEvcF8 e9LUyjaFjJE/JIMjbyiOrkakkKTkC2axuS1m4jOBHkEYIWzhXWLpPi/AbpPR4pJ/vvBsLL Tj+UBkGis5TPZn+nltfEuaLHVVs1tf0= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-306-2rYsaqU-PwOT2CZ-EnfP9g-1; Thu, 08 Jun 2023 06:16:52 -0400 X-MC-Unique: 2rYsaqU-PwOT2CZ-EnfP9g-1 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-97463348446so66053866b.2 for ; Thu, 08 Jun 2023 03:16:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686219411; x=1688811411; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CkSBFkEaQ4x9rH0bVltqMnMT5xLInhrDlt72mpqM2uM=; b=gTER7TIiVDVZ0ghjIOOAe25oxDroL6NZ6V+1EK2JPThpD0uP/0JlGTHykn127K5R5W Nv6LrpmRHATu3Cxjq2kGB78SML5ON2CecNbZ+bQVe0QZ50qfaD2FMC+IA3sk+1pDirPc P23tvogwLg9j8EBzdjiWvmhEkL+GvWviPdf0eaiKoVAADnV1V8Wwel9ZdvTcZTV3BWXb zjxo4QpEz67ZPFp+SNmmG/KPEkCHoD0Bms16f8ApHbCHmXHD4oVj65eTgKJOafHgYME2 sfs8owPod64tkvI6iT2Oo/N2MaWiKPT40M2xH32lNjumtuH10xBUzH04HRrz6oU9wEfh 3wAw== X-Gm-Message-State: AC+VfDx8YM9XGHvW8/ZjpROBnECcHTiuo5hhEAxit4OTAxOeFxgXNPBv GX2IOkv6SKQ5XUIoDPt/QIOfy5UL7INfApesSmISPPtGIwkdPnxxDg0JsgFCPrHVMXr0hse0huM xAqz8GZd1SuFxiVtE9K4Po7PEkqLw X-Received: by 2002:a17:907:72cc:b0:973:9494:4e5c with SMTP id du12-20020a17090772cc00b0097394944e5cmr7850378ejc.65.1686219411437; Thu, 08 Jun 2023 03:16:51 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7x6MAb8Al9ZO5Rr9aBjQBOdF0IBf+DSr4m+9KOnoWcs8EgLyJWZmfwY8JRVpJ0lgZMIUV87A== X-Received: by 2002:a17:907:72cc:b0:973:9494:4e5c with SMTP id du12-20020a17090772cc00b0097394944e5cmr7850367ejc.65.1686219411248; Thu, 08 Jun 2023 03:16:51 -0700 (PDT) Received: from localhost.localdomain ([46.33.96.32]) by smtp.gmail.com with ESMTPSA id e20-20020a170906249400b00977da0f14ffsm506558ejb.171.2023.06.08.03.16.50 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 08 Jun 2023 03:16:50 -0700 (PDT) From: Michal Sekletar To: jirislaby@kernel.org Cc: arozansk@redhat.com, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, msekleta@redhat.com, shuah@kernel.org Subject: [PATCH v2 2/2] selftests: tty: add selftest for tty timestamp updates Date: Thu, 8 Jun 2023 12:16:16 +0200 Message-Id: <20230608101616.44152-2-msekleta@redhat.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230608101616.44152-1-msekleta@redhat.com> References: <20230608101616.44152-1-msekleta@redhat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Signed-off-by: Michal Sekletar --- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/tty/.gitignore | 2 + tools/testing/selftests/tty/Makefile | 5 ++ .../testing/selftests/tty/tty_tstamp_update.c | 88 +++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 tools/testing/selftests/tty/.gitignore create mode 100644 tools/testing/selftests/tty/Makefile create mode 100644 tools/testing/selftests/tty/tty_tstamp_update.c diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 90a62cf75..862f5f9a7 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -86,6 +86,7 @@ TARGETS += timers endif TARGETS += tmpfs TARGETS += tpm2 +TARGETS += tty TARGETS += user TARGETS += vDSO TARGETS += mm diff --git a/tools/testing/selftests/tty/.gitignore b/tools/testing/selftests/tty/.gitignore new file mode 100644 index 000000000..fe70462a4 --- /dev/null +++ b/tools/testing/selftests/tty/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +tty_tstamp_update diff --git a/tools/testing/selftests/tty/Makefile b/tools/testing/selftests/tty/Makefile new file mode 100644 index 000000000..50d7027b2 --- /dev/null +++ b/tools/testing/selftests/tty/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 +CFLAGS = -O2 -Wall +TEST_GEN_PROGS := tty_tstamp_update + +include ../lib.mk diff --git a/tools/testing/selftests/tty/tty_tstamp_update.c b/tools/testing/selftests/tty/tty_tstamp_update.c new file mode 100644 index 000000000..0ee97943d --- /dev/null +++ b/tools/testing/selftests/tty/tty_tstamp_update.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../kselftest.h" + +#define MIN_TTY_PATH_LEN 8 + +static bool tty_valid(char *tty) +{ + if (strlen(tty) < MIN_TTY_PATH_LEN) + return false; + + if (strncmp(tty, "/dev/tty", MIN_TTY_PATH_LEN) == 0 || + strncmp(tty, "/dev/pts", MIN_TTY_PATH_LEN) == 0) + return true; + + return false; +} + +static int write_dev_tty(void) +{ + FILE *f; + int r = 0; + + f = fopen("/dev/tty", "r+"); + if (!f) + return -errno; + + r = fprintf(f, "hello, world!\n"); + if (r != strlen("hello, world!\n")) + r = -EIO; + + fclose(f); + return r; +} + +int main(int argc, char **argv) +{ + int r; + char tty[PATH_MAX] = {}; + struct stat st1, st2; + + ksft_print_header(); + ksft_set_plan(1); + + r = readlink("/proc/self/fd/0", tty, PATH_MAX); + if (r < 0) + ksft_exit_fail_msg("readlink on /proc/self/fd/0 failed: %m\n"); + + if (!tty_valid(tty)) + ksft_exit_skip("invalid tty path '%s'\n", tty); + + r = stat(tty, &st1); + if (r < 0) + ksft_exit_fail_msg("stat failed on tty path '%s': %m\n", tty); + + /* We need to wait at least 8 seconds in order to observe timestamp change */ + /* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fbf47635315ab308c9b58a1ea0906e711a9228de */ + sleep(10); + + r = write_dev_tty(); + if (r < 0) + ksft_exit_fail_msg("failed to write to /dev/tty: %s\n", + strerror(-r)); + + r = stat(tty, &st2); + if (r < 0) + ksft_exit_fail_msg("stat failed on tty path '%s': %m\n", tty); + + /* We wrote to the terminal so timestamps should have been updated */ + if (st1.st_atim.tv_sec == st2.st_atim.tv_sec && + st1.st_mtim.tv_sec == st2.st_mtim.tv_sec) { + ksft_test_result_fail("tty timestamps not updated\n"); + ksft_exit_fail(); + } + + ksft_test_result_pass( + "timestamps of terminal '%s' updated after write to /dev/tty\n", tty); + return EXIT_SUCCESS; +}