From nobody Fri Aug 1 16:49:01 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 4btsNY5g0Wz62rGJ; Fri, 01 Aug 2025 16:49:01 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4btsNY3Lxdz45Hq; Fri, 01 Aug 2025 16:49:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754066941; 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=q4DjLSmfXmhSHXArDgd0IxTTnxVa9+skBKaDKeUfg3U=; b=N3hE5AylsYIN6fNCS4olMg6MphGxR8uHvT3fV+jwPbw7hK1nSvWIsPua8WEKFDeDpaKPYb zLal7fNvNBNf8l/QGvgz/w1djuZ3e5lLegmI4HJ1Iot6T9ZCYXTCzJndtz5i63lxs9Bt7C 0g5ohDdgw6YgEXv5VQNwmaciAqezaOkjV455grWtBPRDdcPhFnZIGoNMjyPYO5Hb5+8qz6 ZN67IBwY4D7fsFQUCnwNcS7JnQ1YOmOEXbSj8gVE8golchQgwDVRtkLrg3JPw/ltp4eWt3 lnzQN88yGw+KduKXkNzrqLVLsoP4191ixX1UIAI2+/KTbSs/siWo5oxtgLki1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754066941; 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=q4DjLSmfXmhSHXArDgd0IxTTnxVa9+skBKaDKeUfg3U=; b=DejiQbGH6gLJhn8qhHDHql/aITALPw/2TLNXPlJPwV5SPNo8vBLr/8uIYCCV5ChzQuUfFZ 51InWVY8u8TqVMi5ghyigUvcJbdKhSlf7LESylfLCy9VSUn3HuU3knmr3NnNzCYN6kOzQz UGdTWyqx0/mCG9gXBl18VcvPBIg6UfsBBq4YQ/VH1bFXV4nFUr7lZqKyVuwJfjUNUUIQ6l eC9CQ2oOcMCecYEVPlJ9Sh1ZQf0TQ/p2J6X8O4fd/bIl3u5jrA5bJMfAogDZ8dyAXrIxz/ FW2hXOqLrV92RSzf23gqfm+NciOoDEd9+/paZ8bwRYYZkE9N8A2j1NF0FzqLmA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754066941; a=rsa-sha256; cv=none; b=yF11ufjTh+tPkPOV7bsPLxhLqeqSLNgOXtua0nKio3VBt/b+IadvUPuuOwbKon/imrUc2X 302lW7ru8M4IiLcfSn/IYh9Z4uTHwKANnnrI/Qk/4VTHOGPQg8UpS/w5ifB4rexI4VtgUC oCiDI2Xk6lKkYTjoolI1wTg+m04dQ9vvqwz6Rx3T7B7tL9JUda40ah9rdeJHFMpsYIyaEt XsTBSsLGZSUsq/hsKQ+7ieUNjULRRhJmM8wtMsjEThaWAnFUVmhFzs66QwIO+3/CTXkEKL CRxp590FdnifLpfxQHeyFZK5ocJE6wX1S0rVWnxH81xo1AMZViqRm5P44mTkxg== 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 4btsNY2PJnzwHM; Fri, 01 Aug 2025 16:49:01 +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 571Gn154023129; Fri, 1 Aug 2025 16:49:01 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 571Gn16q023126; Fri, 1 Aug 2025 16:49:01 GMT (envelope-from git) Date: Fri, 1 Aug 2025 16:49:01 GMT Message-Id: <202508011649.571Gn16q023126@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 011efaa5cd24 - main - devfs readdir: handle short buffer same as UFS 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 011efaa5cd246a67bbe6e37364baa18178a9f7bd Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=011efaa5cd246a67bbe6e37364baa18178a9f7bd commit 011efaa5cd246a67bbe6e37364baa18178a9f7bd Author: Konstantin Belousov AuthorDate: 2025-08-01 08:22:14 +0000 Commit: Konstantin Belousov CommitDate: 2025-08-01 16:48:53 +0000 devfs readdir: handle short buffer same as UFS Return EINVAL if this is the first dirent encountered with the short buffer, or EJUSTRETURN if something was already copied out. This is needed to pass eof check in vop_readdir_post(): we are not at eof but resid was not advanced. Reported and tested by: pho (previous version) Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D51667 --- sys/fs/devfs/devfs_vnops.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 1d744e6593c0..3a64c205186f 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1450,6 +1450,7 @@ devfs_readdir(struct vop_readdir_args *ap) struct devfs_mount *dmp; off_t off; int *tmp_ncookies = NULL; + ssize_t startresid; if (ap->a_vp->v_type != VDIR) return (ENOTDIR); @@ -1482,6 +1483,7 @@ devfs_readdir(struct vop_readdir_args *ap) error = 0; de = ap->a_vp->v_data; off = 0; + startresid = uio->uio_resid; TAILQ_FOREACH(dd, &de->de_dlist, de_list) { KASSERT(dd->de_cdp != (void *)0xdeadc0de, ("%s %d\n", __func__, __LINE__)); if (dd->de_flags & (DE_COVERED | DE_WHITEOUT)) @@ -1494,8 +1496,13 @@ devfs_readdir(struct vop_readdir_args *ap) de = dd; dp = dd->de_dirent; MPASS(dp->d_reclen == GENERIC_DIRSIZ(dp)); - if (dp->d_reclen > uio->uio_resid) + if (dp->d_reclen > uio->uio_resid) { + /* Nothing was copied out, return EINVAL. */ + if (uio->uio_resid == startresid) + error = EINVAL; + /* Otherwise stop. */ break; + } dp->d_fileno = de->de_inode; /* NOTE: d_off is the offset for the *next* entry. */ dp->d_off = off + dp->d_reclen;