Re: [PATCH v3 2/2] vfs: Add new setgid_create_acl test

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Tue, Aug 30, 2022 at 01:07:43PM +0200, Christian Brauner wrote:
> On Tue, Aug 30, 2022 at 07:13:23PM +0800, Yang Xu wrote:
> > The current_umask() is stripped from the mode directly in the vfs if the
> > filesystem either doesn't support acls or the filesystem has been
> > mounted without posic acl support.
> > 
> > If the filesystem does support acls then current_umask() stripping is
> > deferred to posix_acl_create(). So when the filesystem calls
> > posix_acl_create() and there are no acls set or not supported then
> > current_umask() will be stripped.
> > 
> > If the parent directory has a default acl then permissions are based off
> > of that and current_umask() is ignored. Specifically, if the ACL has an
> > ACL_MASK entry, the group permissions correspond to the permissions of
> > the ACL_MASK entry. Otherwise, if the ACL has no ACL_MASK entry, the
> > group permissions correspond to the permissions of the ACL_GROUP_OBJ
> > entry.
> > 
> > Here we only use setfacl to set default acl or add ACL_MASK to check
> > whether inode strip  S_ISGID works correctly.
> > 
> > Like umask test, this patch is also designed to test kernel patchset behaviour
> > "move S_ISGID stripping into the vfs* helper"
> > 
> > Tested-by: Christian Brauner (Microsoft) <brauner@xxxxxxxxxx>
> > Reviewed-by: Christian Brauner (Microsoft) <brauner@xxxxxxxxxx>
> > Signed-off-by: Yang Xu <xuyang2018.jy@xxxxxxxxxxx>
> > ---
> >  src/vfs/idmapped-mounts.c | 907 ++++++++++++++++++++++++++++++++++----
> >  src/vfs/idmapped-mounts.h |   1 +
> >  src/vfs/vfstest.c         | 356 ++++++++++++++-
> >  tests/generic/999         |  33 ++
> >  tests/generic/999.out     |   2 +
> >  5 files changed, 1218 insertions(+), 81 deletions(-)
> >  create mode 100755 tests/generic/999
> >  create mode 100644 tests/generic/999.out
> > 
> > diff --git a/src/vfs/idmapped-mounts.c b/src/vfs/idmapped-mounts.c
> > index 01a5fbd4..c010dfa1 100644
> > --- a/src/vfs/idmapped-mounts.c
> > +++ b/src/vfs/idmapped-mounts.c
> > @@ -7664,7 +7664,6 @@ out:
> >  	return fret;
> >  }
> >  
> > -
> >  /* The current_umask() is stripped from the mode directly in the vfs if the
> >   * filesystem either doesn't support acls or the filesystem has been
> >   * mounted without posic acl support.
> > @@ -8114,94 +8113,842 @@ out:
> >  	return fret;
> >  }
> >  
> > -static const struct test_struct t_idmapped_mounts[] = {
> > -	{ acls,                                                         true,   "posix acls on regular mounts",                                                                 },
> > -	{ create_in_userns,                                             true,   "create operations in user namespace",                                                          },
> > -	{ device_node_in_userns,                                        true,   "device node in user namespace",                                                                },
> > -	{ expected_uid_gid_idmapped_mounts,				true,	"expected ownership on idmapped mounts",							},
> > -	{ fscaps_idmapped_mounts,					true,	"fscaps on idmapped mounts",									},
> > -	{ fscaps_idmapped_mounts_in_userns,				true,	"fscaps on idmapped mounts in user namespace",							},
> > -	{ fscaps_idmapped_mounts_in_userns_separate_userns,		true,	"fscaps on idmapped mounts in user namespace with different id mappings",			},
> > -	{ fsids_mapped,                                                 true,   "mapped fsids",                                                                                 },
> > -	{ fsids_unmapped,                                               true,   "unmapped fsids",                                                                               },
> > -	{ hardlink_crossing_idmapped_mounts,				true,	"cross idmapped mount hardlink",								},
> > -	{ hardlink_from_idmapped_mount,					true,	"hardlinks from idmapped mounts",								},
> > -	{ hardlink_from_idmapped_mount_in_userns,			true,	"hardlinks from idmapped mounts in user namespace",						},
> > -#ifdef HAVE_LIBURING_H
> > -	{ io_uring_idmapped,						true,	"io_uring from idmapped mounts",								},
> > -	{ io_uring_idmapped_userns,					true,	"io_uring from idmapped mounts in user namespace",						},
> > -	{ io_uring_idmapped_unmapped,					true,	"io_uring from idmapped mounts with unmapped ids",						},
> > -	{ io_uring_idmapped_unmapped_userns,				true,	"io_uring from idmapped mounts with unmapped ids in user namespace",				},
> > -#endif
> > -	{ protected_symlinks_idmapped_mounts,				true,	"following protected symlinks on idmapped mounts",						},
> > -	{ protected_symlinks_idmapped_mounts_in_userns,			true,	"following protected symlinks on idmapped mounts in user namespace",				},
> > -	{ rename_crossing_idmapped_mounts,				true,	"cross idmapped mount rename",									},
> > -	{ rename_from_idmapped_mount,					true,	"rename from idmapped mounts",									},
> > -	{ rename_from_idmapped_mount_in_userns,				true,	"rename from idmapped mounts in user namespace",						},
> > -	{ setattr_truncate_idmapped,					true,	"setattr truncate on idmapped mounts",								},
> > -	{ setattr_truncate_idmapped_in_userns,				true,	"setattr truncate on idmapped mounts in user namespace",					},
> > -	{ setgid_create_idmapped,					true,	"create operations in directories with setgid bit set on idmapped mounts",			},
> > -	{ setgid_create_idmapped_in_userns,				true,	"create operations in directories with setgid bit set on idmapped mounts in user namespace",	},
> > -	{ setid_binaries_idmapped_mounts,				true,	"setid binaries on idmapped mounts",								},
> > -	{ setid_binaries_idmapped_mounts_in_userns,			true,	"setid binaries on idmapped mounts in user namespace",						},
> > -	{ setid_binaries_idmapped_mounts_in_userns_separate_userns,	true,	"setid binaries on idmapped mounts in user namespace with different id mappings",		},
> > -	{ sticky_bit_unlink_idmapped_mounts,				true,	"sticky bit unlink operations on idmapped mounts",						},
> > -	{ sticky_bit_unlink_idmapped_mounts_in_userns,			true,	"sticky bit unlink operations on idmapped mounts in user namespace",				},
> > -	{ sticky_bit_rename_idmapped_mounts,				true,	"sticky bit rename operations on idmapped mounts",						},
> > -	{ sticky_bit_rename_idmapped_mounts_in_userns,			true,	"sticky bit rename operations on idmapped mounts in user namespace",				},
> > -	{ symlink_idmapped_mounts,					true,	"symlink from idmapped mounts",									},
> > -	{ symlink_idmapped_mounts_in_userns,				true,	"symlink from idmapped mounts in user namespace",						},
> > -};
> > +/*
> > + * If the parent directory has a default acl then permissions are based off
> > + * of that and current_umask() is ignored. Specifically, if the ACL has an
> > + * ACL_MASK entry, the group permissions correspond to the permissions of
> > + * the ACL_MASK entry. Otherwise, if the ACL has no ACL_MASK entry, the
> > + * group permissions correspond to the permissions of the ACL_GROUP_OBJ
> > + * entry.
> > + *
> > + * Use setfacl to check whether inode strip S_ISGID works correctly under
> > + * the above two situations when enabling idmapped.
> > + *
> > + * Test for commit
> > + * 1639a49ccdce ("fs: move S_ISGID stripping into the vfs_*() helpers").
> > + */
> > +static int setgid_create_acl_idmapped(const struct vfstest_info *info)
> > +{
> > +	int fret = -1;
> > +	int file1_fd = -EBADF, open_tree_fd = -EBADF;
> > +	struct mount_attr attr = {
> > +		.attr_set = MOUNT_ATTR_IDMAP,
> > +	};
> > +	pid_t pid;
> > +	int tmpfile_fd = -EBADF;
> > +	bool supported = false;
> > +	char path[PATH_MAX];
> > +	mode_t mode;
> >  
> > -const struct test_suite s_idmapped_mounts = {
> > -	.tests		= t_idmapped_mounts,
> > -	.nr_tests	= ARRAY_SIZE(t_idmapped_mounts),
> > -};
> > +	if (!caps_supported())
> > +		return 0;
> >  
> > -static const struct test_struct t_fscaps_in_ancestor_userns[] = {
> > -	{ fscaps_idmapped_mounts_in_userns_valid_in_ancestor_userns,	true,	"fscaps on idmapped mounts in user namespace writing fscap valid in ancestor userns",		},
> > -};
> > +	if (fchmod(info->t_dir1_fd, S_IRUSR |
> > +			      S_IWUSR |
> > +			      S_IRGRP |
> 
> This is difficult to review on list and it's not your fault but for the
> future when you see patch that seems really unclean and messed-up it can
> help to pass --minimal to git format-patch.
> 
> I'll apply locally for review.

Ok, still seems good!
Reviewed-by: Christian Brauner (Microsoft) <brauner@xxxxxxxxxx>



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux