From nobody Fri Nov 14 14:36:58 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4d7KTk3gXGz6GWj9; Fri, 14 Nov 2025 14:36:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4d7KTk2LBpz3Sj7; Fri, 14 Nov 2025 14:36:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763131018; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Yl0f7D/I2C1Hlsv1/qTsjSZ7RBg+QanWK/wQoC1tX10=; b=c1/jgAJZAELJPPugM+FlqianRDiJwu83+/aziXad661bJClIHSkG7DIaPhQmo64rD1jcEp mQgaUXPOz4FOJGH2GkWrPXT54Xt6qZUs4Tjuwej8aA9LD8WhdK8wIRhkUz19yQ90c3yjh9 9jk7YUsNRhO/9bhDXWM8Z496s5RrL/T+EXy90zx1KV5eIgvHVc8NkrRUjyYs5ROT2FaG8a ZSWtMu03aczWMj7mzjvBZuWjt5voShb9f8M1iCvOu1cnBcq9VPoqJuMO1FGCndSqaG3SXI hZxEj4Q3YVHQqTKb15STL/uLFtS2WCwHYCIDz0YIrS+g1gU2aMxWs2IKm0ySnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763131018; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Yl0f7D/I2C1Hlsv1/qTsjSZ7RBg+QanWK/wQoC1tX10=; b=e7CBzojVLITNb1vRKR/1ql41gC+aAeGrcBjSeqrYUulfeA6LMQvColKMqtomHWFpuL4NY5 kkzK0/mZNjjxinJpaRH1l271dD4nOvEvLnv9doP/+MpbcPhtGN2iQvq+km50AwDK231k75 h+t46/0JbPVjnuYPwwqdxldg402bKuBT3Dcz2LnPHh9KLY07fJNWyvt6ItmuZjMmR/wQ13 E1n96UbIdP3xet3L9ffYeLspSpOUyxzHu2qcqOjjNJ5Dl0MwLsJaot0PH7bmVKaocWeSDQ mICL3ENfv7I8gBPQ1B3+GRXqzViZIRgcOLkxe6DhpY74bnGC6ZG/9li7oyBW0Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763131018; a=rsa-sha256; cv=none; b=VKqrsj0rocMujecLcCk1EOc5Pb4hJ+F4Mz4G8GoUkNBD0qJsiIbOsaljMGn9g2YYOOZejY u6lfcuHmTpAYnKHKrQrXW4Pu47iOYaBDDcSK/KN7+miN1N8iL1Kao/5uhcig4dajjWspkU jVTysMZZX9B9oxWmz6mMuf4wAIaCtmXHIVfvswIXFbxLc0iDIfUMdPi1OA05CowqFEjS3R NHpG98EpVnSknibhZZI9ysClXUbTdkXNVf++EY/z5IYSMxvij/G9qvYlsit52bSuVXbPi7 lPSQW8kZF1BdwugVwyXbL3j6U2JfaUu3hKdcQ2eIZx4OC7WkovTY9NpIqhCmCg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4d7KTk1r2Vz18mG; Fri, 14 Nov 2025 14:36:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5AEEawL8057956; Fri, 14 Nov 2025 14:36:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5AEEawgq057953; Fri, 14 Nov 2025 14:36:58 GMT (envelope-from git) Date: Fri, 14 Nov 2025 14:36:58 GMT Message-Id: <202511141436.5AEEawgq057953@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kyle Evans Subject: git: 6a9452c8378a - main - lam: fix using stdin more than once List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6a9452c8378a1aa767708ad2d235f847c880a21c Auto-Submitted: auto-generated The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=6a9452c8378a1aa767708ad2d235f847c880a21c commit 6a9452c8378a1aa767708ad2d235f847c880a21c Author: Kyle Evans AuthorDate: 2025-11-14 14:36:20 +0000 Commit: Kyle Evans CommitDate: 2025-11-14 14:36:28 +0000 lam: fix using stdin more than once Historically, lam(1) closes stdin once we've hit EOF the first time, which would stop it from doing anything else on subsequent gatherline() calls with another openfile. However, this doesn't seem to be strictly necessary- the EOF flag on FILEs is quite sticky, so we can assume that a subsequent fgetc(stdin) will flag EOF properly. This 'fixes' the below-referenced commit in the sense that it surfaced this problem as a fatal error, but the issue was pre-existing. If we do `lam - -`, then one gatherline() will fclose(stdin) and set `ip->eof` for *that* openfile, while the next one will then observe that STDIN_FILENO has been closed and turn it into an EBADF. Add a few tests that were easy to snipe while I'm here, but I haven't aimed for anything close to exhaustive because I think re@ would prefer this fix go in sooner rather than later to land in 15.0. Minor style adjustment for the previous commit while we're here. Reported by: cperciva Discussed with: jrtc27 Reviewed by: des, jlduran Fixes: 4472fd66d006 ("lam: fail on I/O errors") MFC after: 3 days (tentative) Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D53750 --- etc/mtree/BSD.tests.dist | 2 ++ usr.bin/lam/Makefile | 5 ++++ usr.bin/lam/lam.c | 5 +--- usr.bin/lam/tests/Makefile | 5 ++++ usr.bin/lam/tests/lam_test.sh | 59 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index f7a3b2a33703..0380b925e64c 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -1165,6 +1165,8 @@ .. jot .. + lam + .. lastcomm .. limits diff --git a/usr.bin/lam/Makefile b/usr.bin/lam/Makefile index e47ea0a98eaa..faad910f2202 100644 --- a/usr.bin/lam/Makefile +++ b/usr.bin/lam/Makefile @@ -1,3 +1,8 @@ +.include + PROG= lam +HAS_TESTS= +SUBDIR.${MK_TESTS}+= tests + .include diff --git a/usr.bin/lam/lam.c b/usr.bin/lam/lam.c index 2194ae7ab596..c1221ca92d0e 100644 --- a/usr.bin/lam/lam.c +++ b/usr.bin/lam/lam.c @@ -213,11 +213,8 @@ gatherline(struct openfile *ip) *p = '\0'; if (c == EOF) { ip->eof = 1; - if (ferror(ip->fp)) { + if (ferror(ip->fp)) err(EX_IOERR, NULL); - } - if (ip->fp == stdin) - fclose(stdin); morefiles--; return (pad(ip)); } diff --git a/usr.bin/lam/tests/Makefile b/usr.bin/lam/tests/Makefile new file mode 100644 index 000000000000..8d41af5e6e09 --- /dev/null +++ b/usr.bin/lam/tests/Makefile @@ -0,0 +1,5 @@ +PACKAGE= tests + +ATF_TESTS_SH= lam_test + +.include diff --git a/usr.bin/lam/tests/lam_test.sh b/usr.bin/lam/tests/lam_test.sh new file mode 100755 index 000000000000..bf3998a42d11 --- /dev/null +++ b/usr.bin/lam/tests/lam_test.sh @@ -0,0 +1,59 @@ +# +# Copyright (c) 2025 Klara, Inc. +# +# SPDX-License-Identifier: BSD-2-Clause +# + +atf_test_case basic +basic_head() +{ + atf_set "descr" "Test basic lam(1) functionality" +} +basic_body() +{ + printf '1\n2\n3\n' > a + printf '4\n5\n6\n' > b + + atf_check -o inline:"14\n25\n36\n" lam a b +} + +atf_test_case sep +sep_head() +{ + atf_set "descr" "Test lam(1) -s and -S options" +} +sep_body() +{ + printf "1\n" > a + printf "0\n" > b + + atf_check -o inline:"x1x0\n" lam -S x a b + atf_check -o inline:"1x0\n" lam a -S x b + atf_check -o inline:"x10\n" lam -S x a -s '' b + + atf_check -o inline:"x10\n" lam -s x a b + atf_check -o inline:"x1y0\n" lam -s x a -s y b + atf_check -o inline:"1x0\n" lam a -s x b +} + +atf_test_case stdin +stdin_head() +{ + atf_set "descr" "Test lam(1) using stdin" +} +stdin_body() +{ + printf '1\n2\n3\n4\n' > a + + atf_check -o inline:"11\n22\n33\n44\n" lam a - < a + atf_check -o inline:"11\n22\n33\n44\n" lam - a < a + + atf_check -o inline:"12\n34\n" lam - - < a +} + +atf_init_test_cases() +{ + atf_add_test_case basic + atf_add_test_case sep + atf_add_test_case stdin +}