From nobody Wed Feb 18 00:25:58 2026 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 4fFy3W2VS4z6SLm0 for ; Wed, 18 Feb 2026 00:25:59 +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" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fFy3V732hz3Gjn for ; Wed, 18 Feb 2026 00:25:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1771374359; 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=QkIT2tLYHJ0MV4/fA1JOJ6zPD+kUOCRc9PFp1a4nmZ8=; b=MJk6Gm90xBPJz2qogj7+hP/HdqAiPuWJsWCBHhb44TZE7M70HtHikqKigdc2hryRDldak3 d14bwRX/+L5gF8AGbxdRyzf9yOCSM+cXUeYE1O7Xf0sBIqSnLRmcZzH0AwaPanLsYcwI95 YBI3lrN5iBwSxcZSyrPzLh36KQ0ngvssJUCHq4mFC1jBY8o6aEHiQtQVuVmNiJTnmIoGP5 E3VgKMXwLSQ38BnYtAkEdohsm6AyeCym+Z2tXBCFvBf8yztZGeCp0RmnykjeP/eHyVMwBh GTcJDtE7iWziKk7yvRCTytA18Yr9mnKymzj5OenwvS4OnCi9vToMz6Ih6l2Imw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1771374359; a=rsa-sha256; cv=none; b=Rjj9A4QOI/NAdhF7LXOIHNWjMDBGk06MAhpPt4CoC9FKtqGDGFUAJbTWRBvkBECfff+5LO n74YsBVY/H7UR/FOlOs4MnuSYg+jiD+h3jfPIkIn2BjuS/k0FlSl9Twhe8kUvLBfWsO5uK y01hLjFXuT2NMN7RDoxlw7VE2QJuiTudhPNKraT2AdFzRkSRYnZoE82HWgBF33WIKunGYa Sis6aKhlRQ6mkcMylxiP87ve1b5bZQ4YG8CT4b687MVsJ7fOj9LDRlU9JM8eqSgAQaaow9 XdJ5r/UkwUDPi/p0A8kWXuJAqFc5SINFWw4WWrWoJD2vzx+xkQ/BPlG/S8ES1w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1771374359; 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=QkIT2tLYHJ0MV4/fA1JOJ6zPD+kUOCRc9PFp1a4nmZ8=; b=PYt+gH/yVKJ7mMf5wv8dILHgpx6mA5X+7w0aMyqNB+3D+xTi2vf4BcbiIHtueOXN6mB02h zpdFOp569f2DQXrqvCYyQpBKg6arDZamTID9PZV/tRg7iF9m1wPQnzf0mnqjo4rptGFSVp IhmzD3Yjac3FeLCHjS8fXuQ8gqW/KSFbA/wCxN+Jn33gUawtyfN2pg5zJAt/gjbaW6+h2S dev7BLMNhVkvu/crQ4LFmsZuT6dSR7Ref6Yty+HceBsjT65WxZmbi4U2tC4jjEOWI60xcq yu/FYOkeolxE12FJedbkl/F4U/o4smd5ZYNq27jokmrj6zwVrwoewQocMQ/NzQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fFy3V6bvPzYqq for ; Wed, 18 Feb 2026 00:25:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3d2c8 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 18 Feb 2026 00:25:58 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav Subject: git: ce4f512dc004 - stable/14 - diff: Tweak range of -C and -U arguments 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: des X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: ce4f512dc004bae5b4b9ec22b449c785e1bf5297 Auto-Submitted: auto-generated Date: Wed, 18 Feb 2026 00:25:58 +0000 Message-Id: <69950716.3d2c8.624e90e@gitrepo.freebsd.org> The branch stable/14 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=ce4f512dc004bae5b4b9ec22b449c785e1bf5297 commit ce4f512dc004bae5b4b9ec22b449c785e1bf5297 Author: Dag-Erling Smørgrav AuthorDate: 2026-02-13 20:18:24 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2026-02-18 00:18:37 +0000 diff: Tweak range of -C and -U arguments POSIX uses the terms “positive decimal integer” for -C and “non-negative decimal integer” for -U, which translates into lower bounds of 1 for -C and 0 for -U. POSIX does not specify a minimum upper bound for either mode, but as of 5fc739eb5949 both our backends support context sizes up to and including INT_MAX, so use that. Having had the opportunity to consult the Unix System Test Suite, the diff test cases found therein happen to precisely match these bounds. While here, switch to using strtonum() to parse numerical arguments, and try to be more consistent in how we report usage errors. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D55261 (cherry picked from commit 790f1d1cc5fa892ba59fd7f239b22064c8ab14c7) --- usr.bin/diff/diff.c | 46 ++++++++++++++++++++++-------------- usr.bin/diff/tests/diff_test.sh | 52 +++++++++++++++++++++++++---------------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/usr.bin/diff/diff.c b/usr.bin/diff/diff.c index ba88964ca131..53b62766ba3e 100644 --- a/usr.bin/diff/diff.c +++ b/usr.bin/diff/diff.c @@ -126,10 +126,9 @@ static bool do_color(void); int main(int argc, char **argv) { - const char *errstr = NULL; - char *ep, **oargv; - long l; - int ch, dflags, lastch, gotstdin, prevoptind, newarg; + const char *errstr; + char **oargv; + int ch, dflags, lastch, gotstdin, prevoptind, newarg; oargv = argv; gotstdin = 0; @@ -166,10 +165,13 @@ main(int argc, char **argv) cflag = true; diff_format = D_CONTEXT; if (optarg != NULL) { - l = strtol(optarg, &ep, 10); - if (*ep != '\0' || l < 0 || l >= INT_MAX) + diff_context = (int) strtonum(optarg, + 1, INT_MAX, &errstr); + if (errstr != NULL) { + warnx("context size is %s: %s", + errstr, optarg); usage(); - diff_context = (int)l; + } } break; case 'd': @@ -265,10 +267,13 @@ main(int argc, char **argv) conflicting_format(); diff_format = D_UNIFIED; if (optarg != NULL) { - l = strtol(optarg, &ep, 10); - if (*ep != '\0' || l < 0 || l >= INT_MAX) + diff_context = (int) strtonum(optarg, + 0, INT_MAX, &errstr); + if (errstr != NULL) { + warnx("context size is %s: %s", + errstr, optarg); usage(); - diff_context = (int)l; + } } break; case 'w': @@ -276,8 +281,10 @@ main(int argc, char **argv) break; case 'W': width = (int) strtonum(optarg, 1, INT_MAX, &errstr); - if (errstr) - errx(1, "width is %s: %s", errstr, optarg); + if (errstr != NULL) { + warnx("width is %s: %s", errstr, optarg); + usage(); + } break; case 'X': read_excludes_file(optarg); @@ -315,8 +322,10 @@ main(int argc, char **argv) break; case OPT_TSIZE: tabsize = (int) strtonum(optarg, 1, INT_MAX, &errstr); - if (errstr) - errx(1, "tabsize is %s: %s", errstr, optarg); + if (errstr != NULL) { + warnx("tabsize is %s: %s", errstr, optarg); + usage(); + } break; case OPT_STRIPCR: dflags |= D_STRIPCR; @@ -331,9 +340,12 @@ main(int argc, char **argv) colorflag = COLORFLAG_ALWAYS; else if (strncmp(optarg, "never", 5) == 0) colorflag = COLORFLAG_NEVER; - else - errx(2, "unsupported --color value '%s' (must be always, auto, or never)", - optarg); + else { + warnx("unsupported --color value " + "(must be always, auto, or never): " + "%s", optarg); + usage(); + } break; case OPT_NO_DEREFERENCE: noderef = true; diff --git a/usr.bin/diff/tests/diff_test.sh b/usr.bin/diff/tests/diff_test.sh index 61fa618b8d2c..07e019aafc4e 100755 --- a/usr.bin/diff/tests/diff_test.sh +++ b/usr.bin/diff/tests/diff_test.sh @@ -24,8 +24,8 @@ atf_test_case functionname atf_test_case noderef atf_test_case ignorecase atf_test_case dirloop -atf_test_case bigc -atf_test_case bigu +atf_test_case crange +atf_test_case urange atf_test_case prleak atf_test_case same @@ -385,30 +385,42 @@ dirloop_body() atf_check diff -r a b } -bigc_head() +crange_head() { - atf_set "descr" "Context diff with very large context" + atf_set "descr" "Context diff context length range" } -bigc_body() +crange_body() { - echo $'x\na\ny' >a - echo $'x\nb\ny' >b - atf_check -s exit:2 -e ignore diff -C$(((1<<31)-1)) a b - atf_check -s exit:1 -o match:'--- 1,3 ---' \ - diff -C$(((1<<31)-2)) a b + echo $'x\nx\na\ny\ny' >a + echo $'x\nx\nb\ny\ny' >b + atf_check -s exit:2 -e match:'too small' \ + diff -C-1 a b + atf_check -s exit:2 -e match:'too small' \ + diff -C0 a b + atf_check -s exit:1 -o match:'--- 2,4 ---' \ + diff -C1 a b + atf_check -s exit:2 -e match:'too large' \ + diff -C$((1<<31)) a b + atf_check -s exit:1 -o match:'--- 1,5 ---' \ + diff -C$(((1<<31)-1)) a b } -bigu_head() +urange_head() { - atf_set "descr" "Unified diff with very large context" + atf_set "descr" "Unified diff context length range" } -bigu_body() +urange_body() { - echo $'x\na\ny' >a - echo $'x\nb\ny' >b - atf_check -s exit:2 -e ignore diff -U$(((1<<31)-1)) a b - atf_check -s exit:1 -o match:'^@@ -1,3 \+1,3 @@$' \ - diff -U$(((1<<31)-2)) a b + echo $'x\nx\na\ny\ny' >a + echo $'x\nx\nb\ny\ny' >b + atf_check -s exit:2 -e match:'too small' \ + diff -U-1 a b + atf_check -s exit:1 -o match:'^@@ -3 \+3 @@$' \ + diff -U0 a b + atf_check -s exit:2 -e match:'too large' \ + diff -U$((1<<31)) a b + atf_check -s exit:1 -o match:'^@@ -1,5 \+1,5 @@$' \ + diff -U$(((1<<31)-1)) a b } prleak_head() @@ -476,8 +488,8 @@ atf_init_test_cases() atf_add_test_case noderef atf_add_test_case ignorecase atf_add_test_case dirloop - atf_add_test_case bigc - atf_add_test_case bigu + atf_add_test_case crange + atf_add_test_case urange atf_add_test_case prleak atf_add_test_case same }