From nobody Wed Nov 19 11:21:21 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 4dBJvk1xt5z6HYLx for ; Wed, 19 Nov 2025 11:21:22 +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 4dBJvj5Qtzz3X14 for ; Wed, 19 Nov 2025 11:21:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763551281; 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=xug/iisEJbhz/h7Gx/Gpt74qw0N6wEFGTXvpk6soXT0=; b=RtxUViDE0BV8d+28/IHYEwb4pPuQLxQ0A5NCgT0lg/17iuRa4JofHuOEcZ6V5ioFzt2NKi SOwBEedWh7xNllAbCbs83V/8MWZOWLCr321uvpyijEGl60mH1t6p3SUYnZkCfmAGSYvkTz OkSGCHWgpC+kN/GqonSN97bJUb/BrcEzaAJGiYQwF5dkc+gD2n1OeUeHIl/I9/hU1PUnU7 fJOhf8mZkguDKo9J8Av/g8veikvy7ZFdz2VXv+VGb8I2VVC5MLg+h3qfaWwBustTZ2pQ1O aJpyL/grxvEhAVBz36cdW254ePnf6gS4c0e4CNNU83cEFkECQD6l6b5MdPeT9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763551281; 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=xug/iisEJbhz/h7Gx/Gpt74qw0N6wEFGTXvpk6soXT0=; b=iQ21wofggnBJsCAhnFTsUrITsq66o5Bs3wVj+ueuq2z238YbgdpNl9qe36hParjVvUa+2s s91TYrLvIBDFsdAamG+ILzHveyXLJdEhjgHGk61kT9TcfCgw1vjO1+xUziKNsSgoKO18Pf UTXGIZeTwrmoie5J8VyciDUjf/GpKJqchRNl7QbxnDHiXMkgnL/GuA2c4OMEtLsVwnx2Cb UPIqcGpSSzUrnUJocc2tAHkFZCej6hxnVsXLqGvk7yX211hHsv8YoapSAerE+zeIr7oxgt lTeHo3zuWeka7pIuAwyUbuCSZ0VGXKMxBy1pAVWaKM11ppV6XLfMzi8AoyUOWQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763551281; a=rsa-sha256; cv=none; b=Wur7tSULvRL3mzT8wLzEUIYz9vGFiKCmQKEb41jPHUMVet8Ugk52BGrpygrPuAqQua9H4Z DL4g4uB9MmU4RqNCBrjNgfMHE9ynms4K9uIrimoQOGov7xc2rFoIVSfwBLBNp4McxVfWvI 6BuYluiqagaxqfXkNRV6jQbKY05MTHNBxqCl1oTT50Uyo7axon0F6AsBnaNV5yj0i+QRd1 NqHSRRfe0XU/9gLA1z0S5RTmUjuanmAG/Bg7n3BJ7/DRGmzdw10dlWxdiDEK/hHyFxisUR bXuxf73XDp3FTFl3sOlXJG/AMI4MKuHK3Aziko+HOOHIogDbBMkAhwnAqYVWnA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dBJvj4nC6zdmg for ; Wed, 19 Nov 2025 11:21:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id bdb2 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 19 Nov 2025 11:21:21 +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: a2630fec78b6 - stable/13 - quot: Rewrite -n mode input parser 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/13 X-Git-Reftype: branch X-Git-Commit: a2630fec78b60844e68cae8b9e1f65b7322a5f05 Auto-Submitted: auto-generated Date: Wed, 19 Nov 2025 11:21:21 +0000 Message-Id: <691da831.bdb2.4cb4b478@gitrepo.freebsd.org> The branch stable/13 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=a2630fec78b60844e68cae8b9e1f65b7322a5f05 commit a2630fec78b60844e68cae8b9e1f65b7322a5f05 Author: Dag-Erling Smørgrav AuthorDate: 2025-11-14 14:28:40 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2025-11-19 11:20:30 +0000 quot: Rewrite -n mode input parser The existing parser was needlessly complicated and wildly inconsistent in how it handled invalid input. Rewrite using getline() and treat invalid input consistently: silently ignore lines that don't begin with a number, and print a warning if the inode number is out of range. PR: 290992 MFC after: 1 week Reviewed by: obrien Differential Revision: https://reviews.freebsd.org/D53726 (cherry picked from commit fa272a5276865a97b01823fe6546940eaaf1b164) (cherry picked from commit 179fa1d81c73ab7ef231e17da73f230e4f8ee5a2) --- usr.sbin/quot/quot.8 | 3 ++- usr.sbin/quot/quot.c | 47 ++++++++++++++++++++++------------------ usr.sbin/quot/tests/quot_test.sh | 19 ++++++++++++++++ 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/usr.sbin/quot/quot.8 b/usr.sbin/quot/quot.8 index 0338457f6aeb..b777aef7288e 100644 --- a/usr.sbin/quot/quot.8 +++ b/usr.sbin/quot/quot.8 @@ -27,7 +27,7 @@ .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd February 8, 1994 +.Dd November 13, 2025 .Dt QUOT 8 .Os .Sh NAME @@ -65,6 +65,7 @@ By default, all sizes are reported in 512-byte block counts. Given a list of inodes (plus some optional data on each line) in the standard input, for each file print out the owner (plus the remainder of the input line). +Lines that do not begin with a number are ignored. This is traditionally used in the pipe: .Bd -literal -offset indent diff --git a/usr.sbin/quot/quot.c b/usr.sbin/quot/quot.c index 28a7173e7340..acde6e411091 100644 --- a/usr.sbin/quot/quot.c +++ b/usr.sbin/quot/quot.c @@ -40,9 +40,10 @@ #include #include +#include #include #include -#include +#include #include #include #include @@ -480,43 +481,47 @@ douser(int fd, struct fs *super, char *name) static void donames(int fd, struct fs *super, char *name) { - int c; - ino_t maxino; - uintmax_t inode; union dinode *dp; + char *end, *line; + size_t cap; + ssize_t len; + intmax_t inode, maxino; maxino = super->fs_ncg * super->fs_ipg - 1; - /* first skip the name of the filesystem */ - while ((c = getchar()) != EOF && (c < '0' || c > '9')) - while ((c = getchar()) != EOF && c != '\n'); - ungetc(c,stdin); - while (scanf("%ju", &inode) == 1) { - if (inode > maxino) { - warnx("illegal inode %ju", inode); - return; + line = NULL; + cap = 0; + while ((len = getline(&line, &cap, stdin)) > 0) { + if (len > 0 && line[len - 1] == '\n') + line[--len] = '\0'; + inode = strtoimax(line, &end, 10); + /* + * Silently ignore lines that do not begin with a number. + * For backward compatibility reasons, we do not require + * the optional comment to be preceded by whitespace. + */ + if (end == line) + continue; + if (inode <= 0 || inode > maxino) { + warnx("invalid inode %jd", inode); + continue; } errno = 0; if ((dp = get_inode(fd,super,inode)) && !isfree(super, dp)) { printf("%s\t",user(DIP(super, dp, di_uid))->name); /* now skip whitespace */ - while ((c = getchar()) == ' ' || c == '\t'); + while (*end == ' ' || *end == '\t') + end++; /* and print out the remainder of the input line */ - while (c != EOF && c != '\n') { - putchar(c); - c = getchar(); - } - putchar('\n'); + printf("%s\n", end); } else { if (errno) { err(1, "%s", name); } /* skip this line */ - while ((c = getchar()) != EOF && c != '\n'); } - if (c == EOF) - break; } + free(line); } static void diff --git a/usr.sbin/quot/tests/quot_test.sh b/usr.sbin/quot/tests/quot_test.sh index 7da9d23ca11f..fd3d6df7b021 100644 --- a/usr.sbin/quot/tests/quot_test.sh +++ b/usr.sbin/quot/tests/quot_test.sh @@ -15,6 +15,8 @@ quot_setup() atf_check mount /dev/$dev "$mnt" echo "/dev/$dev:" >expect printf "%5d\t%5d\t%-8s\n" 8 2 "#0" >>expect + printf "%s\n" "/dev/$dev" >ninput + echo "/dev/$dev:" >nexpect } # Create a directory owned by a given UID @@ -23,12 +25,25 @@ quot_adduid() local uid=$1 atf_check install -d -o $uid -g 0 mnt/$uid printf "%5d\t%5d\t%-8s\n" 4 1 "#$uid" >>expect + ls -di mnt/$uid >>ninput + printf "%s\t%s\n" "#$uid" mnt/$uid >>nexpect } # Perform the tests quot_test() { local dev=$(cat dev) + # Deliberately add invalid lines to our -n input before the + # valid ones to verify that quot does not abort on first + # error. Note that quot deliberately ignores initial lines + # that don't start with a number, and that after encountering + # at least one line that does start with a number, quot would + # previously terminate on encountering one that doesn't (now + # it simply ignores them). This also tests that we don't + # require whitespace between the inode number and the comment. + echo "0zero" >>ninput + echo "invalid" >>ninput + echo "-1minusone" >>ninput # Create inodes owned by a large number of users to exercise # hash collisions and rehashing. The code uses an open hash # table that starts out with only 8 entries and doubles every @@ -49,6 +64,10 @@ quot_test() # that everything gets flushed to the memory disk. atf_check mount -ur /dev/$dev atf_check -o file:expect quot -fkN /dev/$dev + # Test -n option + atf_check -o file:nexpect \ + -e inline:"quot: invalid inode 0\nquot: invalid inode -1\n" \ + quot -Nn /dev/$dev