* [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems
@ 2022-08-16 11:35 Christian Brauner
2022-08-16 11:35 ` [PATCH 2/2] MAINTAINERS: update idmapping tree Christian Brauner
2022-08-16 13:30 ` [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Seth Forshee
0 siblings, 2 replies; 3+ messages in thread
From: Christian Brauner @ 2022-08-16 11:35 UTC (permalink / raw)
To: Seth Forshee, linux-fsdevel
Cc: Christian Brauner, Christoph Hellwig, Aleksa Sarai, Seth Forshee
Ensure that POSIX ACLs checking, getting, and setting works correctly
for filesystems mountable with a filesystem idmapping ("fs_idmapping")
that want to support idmapped mounts ("mnt_idmapping").
Note that no filesystems mountable with an fs_idmapping do yet support
idmapped mounts. This is required infrastructure work to unblock this.
As we explained in detail in [1] the fs_idmapping is irrelevant for
getxattr() and setxattr() when mapping the ACL_{GROUP,USER} {g,u}ids
stored in the uapi struct posix_acl_xattr_entry in
posix_acl_fix_xattr_{from,to}_user().
But for acl_permission_check() and posix_acl_{g,s}etxattr_idmapped_mnt()
the fs_idmapping matters.
acl_permission_check():
During lookup POSIX ACLs are retrieved directly via i_op->get_acl() and
are returned via the kernel internal struct posix_acl which contains
e_{g,u}id members of type k{g,u}id_t that already take the
fs_idmapping into acccount.
For example, a POSIX ACL stored with u4 on the backing store is mapped
to k10000004 in the fs_idmapping. The mnt_idmapping remaps the POSIX ACL
to k20000004. In order to do that the fs_idmapping needs to be taken
into account but that doesn't happen yet (Again, this is a
counterfactual currently as fuse doesn't support idmapped mounts
currently. It's just used as a convenient example.):
fs_idmapping: u0:k10000000:r65536
mnt_idmapping: u0:v20000000:r65536
ACL_USER: k10000004
acl_permission_check()
-> check_acl()
-> get_acl()
-> i_op->get_acl() == fuse_get_acl()
-> posix_acl_from_xattr(u0:k10000000:r65536 /* fs_idmapping */, ...)
{
k10000004 = make_kuid(u0:k10000000:r65536 /* fs_idmapping */,
u4 /* ACL_USER */);
}
-> posix_acl_permission()
{
-1 = make_vfsuid(u0:v20000000:r65536 /* mnt_idmapping */,
&init_user_ns,
k10000004);
vfsuid_eq_kuid(-1, k10000004 /* caller_fsuid */)
}
In order to correctly map from the fs_idmapping into mnt_idmapping we
require the relevant fs_idmaping to be passed:
acl_permission_check()
-> check_acl()
-> get_acl()
-> i_op->get_acl() == fuse_get_acl()
-> posix_acl_from_xattr(u0:k10000000:r65536 /* fs_idmapping */, ...)
{
k10000004 = make_kuid(u0:k10000000:r65536 /* fs_idmapping */,
u4 /* ACL_USER */);
}
-> posix_acl_permission()
{
v20000004 = make_vfsuid(u0:v20000000:r65536 /* mnt_idmapping */,
u0:k10000000:r65536 /* fs_idmapping */,
k10000004);
vfsuid_eq_kuid(v20000004, k10000004 /* caller_fsuid */)
}
The initial_idmapping is only correct for the current situation because
all filesystems that currently support idmapped mounts do not support
being mounted with an fs_idmapping.
Note that ovl_get_acl() is used to retrieve the POSIX ACLs from the
relevant lower layer and the lower layer's mnt_idmapping needs to be
taken into account and so does the fs_idmapping. See 0c5fd887d2bb ("acl:
move idmapped mount fixup into vfs_{g,s}etxattr()") for more details.
For posix_acl_{g,s}etxattr_idmapped_mnt() it is not as obvious why the
fs_idmapping matters as it is for acl_permission_check(). Especially
because it doesn't matter for posix_acl_fix_xattr_{from,to}_user() (See
[1] for more context.).
Because posix_acl_{g,s}etxattr_idmapped_mnt() operate on the uapi
struct posix_acl_xattr_entry which contains {g,u}id_t values and thus
give the impression that the fs_idmapping is irrelevant as at this point
appropriate {g,u}id_t values have seemlingly been generated.
As we've stated multiple times this assumption is wrong and in fact the
uapi struct posix_acl_xattr_entry is taking idmappings into account
depending at what place it is operated on.
posix_acl_getxattr_idmapped_mnt()
When posix_acl_getxattr_idmapped_mnt() is called the values stored in
the uapi struct posix_acl_xattr_entry are mapped according to the
fs_idmapping. This happened when they were read from the backing store
and then translated from struct posix_acl into the uapi
struct posix_acl_xattr_entry during posix_acl_to_xattr().
In other words, the fs_idmapping matters as the values stored as
{g,u}id_t in the uapi struct posix_acl_xattr_entry have been generated
by it.
So we need to take the fs_idmapping into account during make_vfsuid()
in posix_acl_getxattr_idmapped_mnt().
posix_acl_setxattr_idmapped_mnt()
When posix_acl_setxattr_idmapped_mnt() is called the values stored as
{g,u}id_t in uapi struct posix_acl_xattr_entry are intended to be the
values that ultimately get turned back into a k{g,u}id_t in
posix_acl_from_xattr() (which turns the uapi
struct posix_acl_xattr_entry into the kernel internal struct posix_acl).
In other words, the fs_idmapping matters as the values stored as
{g,u}id_t in the uapi struct posix_acl_xattr_entry are intended to be
the values that will be undone in the fs_idmapping when writing to the
backing store.
So we need to take the fs_idmapping into account during from_vfsuid()
in posix_acl_setxattr_idmapped_mnt().
Link: https://lore.kernel.org/all/20220801145520.1532837-1-brauner@kernel.org [1]
Fixes: 0c5fd887d2bb ("acl: move idmapped mount fixup into vfs_{g,s}etxattr()")
Cc: Seth Forshee <sforshee@digitalocean.com>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
---
fs/overlayfs/inode.c | 11 +++++++----
fs/posix_acl.c | 15 +++++++++------
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index b45fea69fff3..0fbcb590af84 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -460,9 +460,12 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
* of the POSIX ACLs retrieved from the lower layer to this function to not
* alter the POSIX ACLs for the underlying filesystem.
*/
-static void ovl_idmap_posix_acl(struct user_namespace *mnt_userns,
+static void ovl_idmap_posix_acl(struct inode *realinode,
+ struct user_namespace *mnt_userns,
struct posix_acl *acl)
{
+ struct user_namespace *fs_userns = i_user_ns(realinode);
+
for (unsigned int i = 0; i < acl->a_count; i++) {
vfsuid_t vfsuid;
vfsgid_t vfsgid;
@@ -470,11 +473,11 @@ static void ovl_idmap_posix_acl(struct user_namespace *mnt_userns,
struct posix_acl_entry *e = &acl->a_entries[i];
switch (e->e_tag) {
case ACL_USER:
- vfsuid = make_vfsuid(mnt_userns, &init_user_ns, e->e_uid);
+ vfsuid = make_vfsuid(mnt_userns, fs_userns, e->e_uid);
e->e_uid = vfsuid_into_kuid(vfsuid);
break;
case ACL_GROUP:
- vfsgid = make_vfsgid(mnt_userns, &init_user_ns, e->e_gid);
+ vfsgid = make_vfsgid(mnt_userns, fs_userns, e->e_gid);
e->e_gid = vfsgid_into_kgid(vfsgid);
break;
}
@@ -536,7 +539,7 @@ struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu)
if (!clone)
clone = ERR_PTR(-ENOMEM);
else
- ovl_idmap_posix_acl(mnt_user_ns(realpath.mnt), clone);
+ ovl_idmap_posix_acl(realinode, mnt_user_ns(realpath.mnt), clone);
/*
* Since we're not in RCU path walk we always need to release the
* original ACLs.
diff --git a/fs/posix_acl.c b/fs/posix_acl.c
index 1d17d7b13dcd..5af33800743e 100644
--- a/fs/posix_acl.c
+++ b/fs/posix_acl.c
@@ -361,6 +361,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
const struct posix_acl *acl, int want)
{
const struct posix_acl_entry *pa, *pe, *mask_obj;
+ struct user_namespace *fs_userns = i_user_ns(inode);
int found = 0;
vfsuid_t vfsuid;
vfsgid_t vfsgid;
@@ -376,7 +377,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
goto check_perm;
break;
case ACL_USER:
- vfsuid = make_vfsuid(mnt_userns, &init_user_ns,
+ vfsuid = make_vfsuid(mnt_userns, fs_userns,
pa->e_uid);
if (vfsuid_eq_kuid(vfsuid, current_fsuid()))
goto mask;
@@ -390,7 +391,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
}
break;
case ACL_GROUP:
- vfsgid = make_vfsgid(mnt_userns, &init_user_ns,
+ vfsgid = make_vfsgid(mnt_userns, fs_userns,
pa->e_gid);
if (vfsgid_in_group_p(vfsgid)) {
found = 1;
@@ -736,6 +737,7 @@ void posix_acl_getxattr_idmapped_mnt(struct user_namespace *mnt_userns,
{
struct posix_acl_xattr_header *header = value;
struct posix_acl_xattr_entry *entry = (void *)(header + 1), *end;
+ struct user_namespace *fs_userns = i_user_ns(inode);
int count;
vfsuid_t vfsuid;
vfsgid_t vfsgid;
@@ -753,13 +755,13 @@ void posix_acl_getxattr_idmapped_mnt(struct user_namespace *mnt_userns,
switch (le16_to_cpu(entry->e_tag)) {
case ACL_USER:
uid = make_kuid(&init_user_ns, le32_to_cpu(entry->e_id));
- vfsuid = make_vfsuid(mnt_userns, &init_user_ns, uid);
+ vfsuid = make_vfsuid(mnt_userns, fs_userns, uid);
entry->e_id = cpu_to_le32(from_kuid(&init_user_ns,
vfsuid_into_kuid(vfsuid)));
break;
case ACL_GROUP:
gid = make_kgid(&init_user_ns, le32_to_cpu(entry->e_id));
- vfsgid = make_vfsgid(mnt_userns, &init_user_ns, gid);
+ vfsgid = make_vfsgid(mnt_userns, fs_userns, gid);
entry->e_id = cpu_to_le32(from_kgid(&init_user_ns,
vfsgid_into_kgid(vfsgid)));
break;
@@ -775,6 +777,7 @@ void posix_acl_setxattr_idmapped_mnt(struct user_namespace *mnt_userns,
{
struct posix_acl_xattr_header *header = value;
struct posix_acl_xattr_entry *entry = (void *)(header + 1), *end;
+ struct user_namespace *fs_userns = i_user_ns(inode);
int count;
vfsuid_t vfsuid;
vfsgid_t vfsgid;
@@ -793,13 +796,13 @@ void posix_acl_setxattr_idmapped_mnt(struct user_namespace *mnt_userns,
case ACL_USER:
uid = make_kuid(&init_user_ns, le32_to_cpu(entry->e_id));
vfsuid = VFSUIDT_INIT(uid);
- uid = from_vfsuid(mnt_userns, &init_user_ns, vfsuid);
+ uid = from_vfsuid(mnt_userns, fs_userns, vfsuid);
entry->e_id = cpu_to_le32(from_kuid(&init_user_ns, uid));
break;
case ACL_GROUP:
gid = make_kgid(&init_user_ns, le32_to_cpu(entry->e_id));
vfsgid = VFSGIDT_INIT(gid);
- gid = from_vfsgid(mnt_userns, &init_user_ns, vfsgid);
+ gid = from_vfsgid(mnt_userns, fs_userns, vfsgid);
entry->e_id = cpu_to_le32(from_kgid(&init_user_ns, gid));
break;
default:
base-commit: 568035b01cfb107af8d2e4bd2fb9aea22cf5b868
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] MAINTAINERS: update idmapping tree
2022-08-16 11:35 [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Christian Brauner
@ 2022-08-16 11:35 ` Christian Brauner
2022-08-16 13:30 ` [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Seth Forshee
1 sibling, 0 replies; 3+ messages in thread
From: Christian Brauner @ 2022-08-16 11:35 UTC (permalink / raw)
To: Seth Forshee, linux-fsdevel
Cc: Christian Brauner, Christoph Hellwig, Aleksa Sarai, Seth Forshee
Since Seth joined as a maintainer in ba40a57ff08b ("Add Seth Forshee as
co-maintainer for idmapped mounts") it was best to get a shared git tree
instead of using our personal repositories. So we requested and
Konstantin suggested and gave us a new "idmapping" repository under the
pre-existing but mainly unused vfs namespace. Just makes it easier for
Seth to send fixes in case I'm out or someone else ever takes over.
Cc: Seth Forshee <sforshee@digitalocean.com>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
---
MAINTAINERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 8a5012ba6ff9..a558794dddf9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9780,7 +9780,7 @@ M: Christian Brauner <brauner@kernel.org>
M: Seth Forshee <sforshee@kernel.org>
L: linux-fsdevel@vger.kernel.org
S: Maintained
-T: git git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux.git
+T: git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
F: Documentation/filesystems/idmappings.rst
F: tools/testing/selftests/mount_setattr/
F: include/linux/mnt_idmapping.h
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems
2022-08-16 11:35 [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Christian Brauner
2022-08-16 11:35 ` [PATCH 2/2] MAINTAINERS: update idmapping tree Christian Brauner
@ 2022-08-16 13:30 ` Seth Forshee
1 sibling, 0 replies; 3+ messages in thread
From: Seth Forshee @ 2022-08-16 13:30 UTC (permalink / raw)
To: Christian Brauner; +Cc: linux-fsdevel, Christoph Hellwig, Aleksa Sarai
On Tue, Aug 16, 2022 at 01:35:13PM +0200, Christian Brauner wrote:
> Ensure that POSIX ACLs checking, getting, and setting works correctly
> for filesystems mountable with a filesystem idmapping ("fs_idmapping")
> that want to support idmapped mounts ("mnt_idmapping").
>
> Note that no filesystems mountable with an fs_idmapping do yet support
> idmapped mounts. This is required infrastructure work to unblock this.
>
> As we explained in detail in [1] the fs_idmapping is irrelevant for
> getxattr() and setxattr() when mapping the ACL_{GROUP,USER} {g,u}ids
> stored in the uapi struct posix_acl_xattr_entry in
> posix_acl_fix_xattr_{from,to}_user().
>
> But for acl_permission_check() and posix_acl_{g,s}etxattr_idmapped_mnt()
> the fs_idmapping matters.
>
> acl_permission_check():
> During lookup POSIX ACLs are retrieved directly via i_op->get_acl() and
> are returned via the kernel internal struct posix_acl which contains
> e_{g,u}id members of type k{g,u}id_t that already take the
> fs_idmapping into acccount.
>
> For example, a POSIX ACL stored with u4 on the backing store is mapped
> to k10000004 in the fs_idmapping. The mnt_idmapping remaps the POSIX ACL
> to k20000004. In order to do that the fs_idmapping needs to be taken
> into account but that doesn't happen yet (Again, this is a
> counterfactual currently as fuse doesn't support idmapped mounts
> currently. It's just used as a convenient example.):
>
> fs_idmapping: u0:k10000000:r65536
> mnt_idmapping: u0:v20000000:r65536
> ACL_USER: k10000004
>
> acl_permission_check()
> -> check_acl()
> -> get_acl()
> -> i_op->get_acl() == fuse_get_acl()
> -> posix_acl_from_xattr(u0:k10000000:r65536 /* fs_idmapping */, ...)
> {
> k10000004 = make_kuid(u0:k10000000:r65536 /* fs_idmapping */,
> u4 /* ACL_USER */);
> }
> -> posix_acl_permission()
> {
> -1 = make_vfsuid(u0:v20000000:r65536 /* mnt_idmapping */,
> &init_user_ns,
> k10000004);
> vfsuid_eq_kuid(-1, k10000004 /* caller_fsuid */)
> }
>
> In order to correctly map from the fs_idmapping into mnt_idmapping we
> require the relevant fs_idmaping to be passed:
>
> acl_permission_check()
> -> check_acl()
> -> get_acl()
> -> i_op->get_acl() == fuse_get_acl()
> -> posix_acl_from_xattr(u0:k10000000:r65536 /* fs_idmapping */, ...)
> {
> k10000004 = make_kuid(u0:k10000000:r65536 /* fs_idmapping */,
> u4 /* ACL_USER */);
> }
> -> posix_acl_permission()
> {
> v20000004 = make_vfsuid(u0:v20000000:r65536 /* mnt_idmapping */,
> u0:k10000000:r65536 /* fs_idmapping */,
> k10000004);
> vfsuid_eq_kuid(v20000004, k10000004 /* caller_fsuid */)
> }
>
> The initial_idmapping is only correct for the current situation because
> all filesystems that currently support idmapped mounts do not support
> being mounted with an fs_idmapping.
>
> Note that ovl_get_acl() is used to retrieve the POSIX ACLs from the
> relevant lower layer and the lower layer's mnt_idmapping needs to be
> taken into account and so does the fs_idmapping. See 0c5fd887d2bb ("acl:
> move idmapped mount fixup into vfs_{g,s}etxattr()") for more details.
>
> For posix_acl_{g,s}etxattr_idmapped_mnt() it is not as obvious why the
> fs_idmapping matters as it is for acl_permission_check(). Especially
> because it doesn't matter for posix_acl_fix_xattr_{from,to}_user() (See
> [1] for more context.).
>
> Because posix_acl_{g,s}etxattr_idmapped_mnt() operate on the uapi
> struct posix_acl_xattr_entry which contains {g,u}id_t values and thus
> give the impression that the fs_idmapping is irrelevant as at this point
> appropriate {g,u}id_t values have seemlingly been generated.
>
> As we've stated multiple times this assumption is wrong and in fact the
> uapi struct posix_acl_xattr_entry is taking idmappings into account
> depending at what place it is operated on.
>
> posix_acl_getxattr_idmapped_mnt()
> When posix_acl_getxattr_idmapped_mnt() is called the values stored in
> the uapi struct posix_acl_xattr_entry are mapped according to the
> fs_idmapping. This happened when they were read from the backing store
> and then translated from struct posix_acl into the uapi
> struct posix_acl_xattr_entry during posix_acl_to_xattr().
>
> In other words, the fs_idmapping matters as the values stored as
> {g,u}id_t in the uapi struct posix_acl_xattr_entry have been generated
> by it.
>
> So we need to take the fs_idmapping into account during make_vfsuid()
> in posix_acl_getxattr_idmapped_mnt().
>
> posix_acl_setxattr_idmapped_mnt()
> When posix_acl_setxattr_idmapped_mnt() is called the values stored as
> {g,u}id_t in uapi struct posix_acl_xattr_entry are intended to be the
> values that ultimately get turned back into a k{g,u}id_t in
> posix_acl_from_xattr() (which turns the uapi
> struct posix_acl_xattr_entry into the kernel internal struct posix_acl).
>
> In other words, the fs_idmapping matters as the values stored as
> {g,u}id_t in the uapi struct posix_acl_xattr_entry are intended to be
> the values that will be undone in the fs_idmapping when writing to the
> backing store.
>
> So we need to take the fs_idmapping into account during from_vfsuid()
> in posix_acl_setxattr_idmapped_mnt().
>
> Link: https://lore.kernel.org/all/20220801145520.1532837-1-brauner@kernel.org [1]
> Fixes: 0c5fd887d2bb ("acl: move idmapped mount fixup into vfs_{g,s}etxattr()")
> Cc: Seth Forshee <sforshee@digitalocean.com>
> Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Looks good to me.
Reviewed-by: Seth Forshee <sforshee@digitalocean.com>
> ---
> fs/overlayfs/inode.c | 11 +++++++----
> fs/posix_acl.c | 15 +++++++++------
> 2 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
> index b45fea69fff3..0fbcb590af84 100644
> --- a/fs/overlayfs/inode.c
> +++ b/fs/overlayfs/inode.c
> @@ -460,9 +460,12 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
> * of the POSIX ACLs retrieved from the lower layer to this function to not
> * alter the POSIX ACLs for the underlying filesystem.
> */
> -static void ovl_idmap_posix_acl(struct user_namespace *mnt_userns,
> +static void ovl_idmap_posix_acl(struct inode *realinode,
> + struct user_namespace *mnt_userns,
> struct posix_acl *acl)
> {
> + struct user_namespace *fs_userns = i_user_ns(realinode);
> +
> for (unsigned int i = 0; i < acl->a_count; i++) {
> vfsuid_t vfsuid;
> vfsgid_t vfsgid;
> @@ -470,11 +473,11 @@ static void ovl_idmap_posix_acl(struct user_namespace *mnt_userns,
> struct posix_acl_entry *e = &acl->a_entries[i];
> switch (e->e_tag) {
> case ACL_USER:
> - vfsuid = make_vfsuid(mnt_userns, &init_user_ns, e->e_uid);
> + vfsuid = make_vfsuid(mnt_userns, fs_userns, e->e_uid);
> e->e_uid = vfsuid_into_kuid(vfsuid);
> break;
> case ACL_GROUP:
> - vfsgid = make_vfsgid(mnt_userns, &init_user_ns, e->e_gid);
> + vfsgid = make_vfsgid(mnt_userns, fs_userns, e->e_gid);
> e->e_gid = vfsgid_into_kgid(vfsgid);
> break;
> }
> @@ -536,7 +539,7 @@ struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu)
> if (!clone)
> clone = ERR_PTR(-ENOMEM);
> else
> - ovl_idmap_posix_acl(mnt_user_ns(realpath.mnt), clone);
> + ovl_idmap_posix_acl(realinode, mnt_user_ns(realpath.mnt), clone);
> /*
> * Since we're not in RCU path walk we always need to release the
> * original ACLs.
> diff --git a/fs/posix_acl.c b/fs/posix_acl.c
> index 1d17d7b13dcd..5af33800743e 100644
> --- a/fs/posix_acl.c
> +++ b/fs/posix_acl.c
> @@ -361,6 +361,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
> const struct posix_acl *acl, int want)
> {
> const struct posix_acl_entry *pa, *pe, *mask_obj;
> + struct user_namespace *fs_userns = i_user_ns(inode);
> int found = 0;
> vfsuid_t vfsuid;
> vfsgid_t vfsgid;
> @@ -376,7 +377,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
> goto check_perm;
> break;
> case ACL_USER:
> - vfsuid = make_vfsuid(mnt_userns, &init_user_ns,
> + vfsuid = make_vfsuid(mnt_userns, fs_userns,
> pa->e_uid);
> if (vfsuid_eq_kuid(vfsuid, current_fsuid()))
> goto mask;
> @@ -390,7 +391,7 @@ posix_acl_permission(struct user_namespace *mnt_userns, struct inode *inode,
> }
> break;
> case ACL_GROUP:
> - vfsgid = make_vfsgid(mnt_userns, &init_user_ns,
> + vfsgid = make_vfsgid(mnt_userns, fs_userns,
> pa->e_gid);
> if (vfsgid_in_group_p(vfsgid)) {
> found = 1;
> @@ -736,6 +737,7 @@ void posix_acl_getxattr_idmapped_mnt(struct user_namespace *mnt_userns,
> {
> struct posix_acl_xattr_header *header = value;
> struct posix_acl_xattr_entry *entry = (void *)(header + 1), *end;
> + struct user_namespace *fs_userns = i_user_ns(inode);
> int count;
> vfsuid_t vfsuid;
> vfsgid_t vfsgid;
> @@ -753,13 +755,13 @@ void posix_acl_getxattr_idmapped_mnt(struct user_namespace *mnt_userns,
> switch (le16_to_cpu(entry->e_tag)) {
> case ACL_USER:
> uid = make_kuid(&init_user_ns, le32_to_cpu(entry->e_id));
> - vfsuid = make_vfsuid(mnt_userns, &init_user_ns, uid);
> + vfsuid = make_vfsuid(mnt_userns, fs_userns, uid);
> entry->e_id = cpu_to_le32(from_kuid(&init_user_ns,
> vfsuid_into_kuid(vfsuid)));
> break;
> case ACL_GROUP:
> gid = make_kgid(&init_user_ns, le32_to_cpu(entry->e_id));
> - vfsgid = make_vfsgid(mnt_userns, &init_user_ns, gid);
> + vfsgid = make_vfsgid(mnt_userns, fs_userns, gid);
> entry->e_id = cpu_to_le32(from_kgid(&init_user_ns,
> vfsgid_into_kgid(vfsgid)));
> break;
> @@ -775,6 +777,7 @@ void posix_acl_setxattr_idmapped_mnt(struct user_namespace *mnt_userns,
> {
> struct posix_acl_xattr_header *header = value;
> struct posix_acl_xattr_entry *entry = (void *)(header + 1), *end;
> + struct user_namespace *fs_userns = i_user_ns(inode);
> int count;
> vfsuid_t vfsuid;
> vfsgid_t vfsgid;
> @@ -793,13 +796,13 @@ void posix_acl_setxattr_idmapped_mnt(struct user_namespace *mnt_userns,
> case ACL_USER:
> uid = make_kuid(&init_user_ns, le32_to_cpu(entry->e_id));
> vfsuid = VFSUIDT_INIT(uid);
> - uid = from_vfsuid(mnt_userns, &init_user_ns, vfsuid);
> + uid = from_vfsuid(mnt_userns, fs_userns, vfsuid);
> entry->e_id = cpu_to_le32(from_kuid(&init_user_ns, uid));
> break;
> case ACL_GROUP:
> gid = make_kgid(&init_user_ns, le32_to_cpu(entry->e_id));
> vfsgid = VFSGIDT_INIT(gid);
> - gid = from_vfsgid(mnt_userns, &init_user_ns, vfsgid);
> + gid = from_vfsgid(mnt_userns, fs_userns, vfsgid);
> entry->e_id = cpu_to_le32(from_kgid(&init_user_ns, gid));
> break;
> default:
>
> base-commit: 568035b01cfb107af8d2e4bd2fb9aea22cf5b868
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-08-16 13:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-08-16 11:35 [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Christian Brauner
2022-08-16 11:35 ` [PATCH 2/2] MAINTAINERS: update idmapping tree Christian Brauner
2022-08-16 13:30 ` [PATCH 1/2] acl: handle idmapped mounts for idmapped filesystems Seth Forshee
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).