From nobody Sat Nov 15 14:43:23 2025 X-Original-To: dev-commits-src-branches@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 4d7xZh0BgNz6GQPs; Sat, 15 Nov 2025 14:43:24 +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 4d7xZg5gHTz3CY8; Sat, 15 Nov 2025 14:43:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763217803; 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=gCenzzmFr77FYqJEODI9v+H/b8QuT70an2t2TFm3zzM=; b=s5JMWsKX81wunaM5t3I8irPI48obaamIeJaS3j46qdxnTboeF4MC/t09M8K+blilIwMsg6 EsY/dZOvll5BCua4bqWkzE5JBkhppAtbqq2WjlwEPXG66u5QF7XVsnDwvN49jZv/Bv68SV BcHPNf0O+NI/miL4le2PyQUg5h6EhoLruPQHoX75Vu5p4vrcabvZrlzFsSJoQqBbQnEC/G qHGVYyiLfkXk9hqNbCm04OZQExsKwuX/Y4dfjWOdldBdztvi+DGvWtYEKUt4k4lI+3qFIm I7vYA119Q3Wd9dLvZCEevB6gsS0crisIzwrWoEMgasCwjIarVWXIbTrDFuIOHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763217803; 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=gCenzzmFr77FYqJEODI9v+H/b8QuT70an2t2TFm3zzM=; b=eB3jsvHa6K+3lXN/3DpLjIy3GWX1WNQrp78T99HzjCurL6bHUvEp5N6g6v2z1eP24nAfOA 4MYVz0R4qywvXkr2QVr0kE65WH96RfLGqEg+R4IEU/5gUIBEdxXduQY6335jhJivHryEas XUXtUZeuqAUVzbPI899aoS5+AnsJRJeUl/AyeIj6y8e57XKZhI2kHmE4Qp/cLI5whuy5kY 9EnLbJekbreBLsNYKruQktqSXULsWWhdA7UzYaN+lzWJBedbO36iHlb0MEGgnBCWghY6Ri Rf+HQUs1X7XAJxhtBQeyw8qzx3fYCzgDbFHKvr3i2/8s7JYFIfktQiqyTKsEGw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763217803; a=rsa-sha256; cv=none; b=Qj96j5NftAElYE8WLnF10Z8xsP0onC9t6uppH5R5brdt//GxTCMYvp62zyrUUkFz9sxKej 7XdE3zuxqSrBO0gVSG68O+s+zq4ScinU1xYwc96Ckz/+ZqlbAA79Fo9Y+qkZQgUODuu3JY QOAXa5t5QFXQr1cayWVsbZ9k3kygPrl7fLI4Co2Or/gnjK7SXUeONrF9UO80EdUUfRpo/v cc0lzhEP0JY6bVfWthz0IfRZfUHcklbBlL5FNcUjqCAVvearHBE3StzFAn5zQVqgEd08pp c47OJwYOI/uw/i21O4ERoq4bywQMAV4c+2uPSKeZIWMqmHR3O7nrTayhpyiYwA== 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 4d7xZg538gzxM2; Sat, 15 Nov 2025 14:43:23 +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 5AFEhNdJ083152; Sat, 15 Nov 2025 14:43:23 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5AFEhNQH083149; Sat, 15 Nov 2025 14:43:23 GMT (envelope-from git) Date: Sat, 15 Nov 2025 14:43:23 GMT Message-Id: <202511151443.5AFEhNQH083149@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Colin Percival Subject: git: 81f61990b28e - releng/15.0 - lam: fix using stdin more than once List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cperciva X-Git-Repository: src X-Git-Refname: refs/heads/releng/15.0 X-Git-Reftype: branch X-Git-Commit: 81f61990b28e63b80007727be5a31db2226bb2c2 Auto-Submitted: auto-generated The branch releng/15.0 has been updated by cperciva: URL: https://cgit.FreeBSD.org/src/commit/?id=81f61990b28e63b80007727be5a31db2226bb2c2 commit 81f61990b28e63b80007727be5a31db2226bb2c2 Author: Kyle Evans AuthorDate: 2025-11-14 14:36:20 +0000 Commit: Colin Percival CommitDate: 2025-11-15 14:43:05 +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. Approved by: re (cperciva) Reported by: cperciva Discussed with: jrtc27 Reviewed by: des, jlduran Fixes: 4472fd66d006 ("lam: fail on I/O errors") Sponsored by: Klara, Inc. (cherry picked from commit 6a9452c8378a1aa767708ad2d235f847c880a21c) (cherry picked from commit 1d678ba5756978240140beb5c1ebd38bb778ed66) --- 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 520b41c8b88f..41151d35e518 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -1163,6 +1163,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 +}