git: 156745b42d9e - main - fdescfs: allow chown/utime etc on fdescfs fd for underlying files opened with O_PATH

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 06 Jun 2022 19:28:05 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=156745b42d9e6dfa3d9c6dc480db7836683850cf

commit 156745b42d9e6dfa3d9c6dc480db7836683850cf
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2022-06-05 18:49:09 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2022-06-06 19:27:36 +0000

    fdescfs: allow chown/utime etc on fdescfs fd for underlying files opened with O_PATH
    
    Reported and tested by: dchagin
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D35410
---
 sys/fs/fdescfs/fdesc_vnops.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/sys/fs/fdescfs/fdesc_vnops.c b/sys/fs/fdescfs/fdesc_vnops.c
index 2fbdcac34583..ae6d60d0fc55 100644
--- a/sys/fs/fdescfs/fdesc_vnops.c
+++ b/sys/fs/fdescfs/fdesc_vnops.c
@@ -492,9 +492,15 @@ fdesc_setattr(struct vop_setattr_args *ap)
 
 	/*
 	 * Allow setattr where there is an underlying vnode.
+	 * For O_PATH descriptors, disallow truncate.
 	 */
-	error = getvnode(td, fd,
-	    cap_rights_init_one(&rights, CAP_EXTATTR_SET), &fp);
+	if (vap->va_size != VNOVAL) {
+		error = getvnode(td, fd,
+		    cap_rights_init_one(&rights, CAP_EXTATTR_SET), &fp);
+	} else {
+		error = getvnode_path(td, fd,
+		    cap_rights_init_one(&rights, CAP_EXTATTR_SET), &fp);
+	}
 	if (error) {
 		/*
 		 * getvnode() returns EINVAL if the file descriptor is not