ksmbd: fix translation in sid_to_id()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 24 Aug 2021 11:10:20 +0000 (20:10 +0900)
committerSteve French <stfrench@microsoft.com>
Sat, 4 Sep 2021 04:29:45 +0000 (23:29 -0500)
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>
fs/ksmbd/smbacl.c

index e49e9bc..ef58962 100644 (file)
@@ -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;
                        }
@@ -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;
                        }