Skip to content

Commit

Permalink
ksmbd: fix translation in sid_to_id()
Browse files Browse the repository at this point in the history
The sid_to_id() functions is relevant when changing ownership of
filesystem objects based on acl information. In this case we need to
first translate the relevant s*ids into k*ids in ksmbd's user namespace
and account for any idmapped mounts. Requesting a change in ownership
requires the inverse translation to be applied when we would report
ownership to userspace. So k*id_from_mnt() must be used here.

Cc: Steve French <stfrench@microsoft.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Namjae Jeon <namjae.jeon@samsung.com>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Christian Brauner authored and Steve French committed Sep 4, 2021
1 parent f0bb29d commit 55cd04d
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions fs/ksmbd/smbacl.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,15 @@ static int sid_to_id(struct user_namespace *user_ns,

id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
if (id >= 0) {
uid = make_kuid(user_ns, id);
if (uid_valid(uid) && kuid_has_mapping(user_ns, uid)) {
/*
* Translate raw sid into kuid in the server's user
* namespace.
*/
uid = make_kuid(&init_user_ns, id);

/* If this is an idmapped mount, apply the idmapping. */
uid = kuid_from_mnt(user_ns, uid);
if (uid_valid(uid)) {
fattr->cf_uid = uid;
rc = 0;
}
Expand All @@ -287,8 +294,15 @@ static int sid_to_id(struct user_namespace *user_ns,

id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
if (id >= 0) {
gid = make_kgid(user_ns, id);
if (gid_valid(gid) && kgid_has_mapping(user_ns, gid)) {
/*
* Translate raw sid into kgid in the server's user
* namespace.
*/
gid = make_kgid(&init_user_ns, id);

/* If this is an idmapped mount, apply the idmapping. */
gid = kgid_from_mnt(user_ns, gid);
if (gid_valid(gid)) {
fattr->cf_gid = gid;
rc = 0;
}
Expand Down

0 comments on commit 55cd04d

Please sign in to comment.