]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: fix `force create mode' and `force directory mode'
authorAtte Heikkilä <atteh.mailbox@gmail.com>
Mon, 18 Dec 2023 15:34:21 +0000 (00:34 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Dec 2023 09:41:57 +0000 (10:41 +0100)
[ Upstream commit 65656f5242e500dcfeffa6a0a1519eae14724f86 ]

`force create mode' and `force directory mode' should be bitwise ORed
with the perms after `create mask' and `directory mask' have been
applied, respectively.

Signed-off-by: Atte Heikkilä <atteh.mailbox@gmail.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ksmbd/mgmt/share_config.h

index 3fd33829394219bbbbe2203c02f770b7e9912c7a..5f591751b92365eac17d7e391ccdd57bc0a2e9b6 100644 (file)
@@ -34,29 +34,22 @@ struct ksmbd_share_config {
 #define KSMBD_SHARE_INVALID_UID        ((__u16)-1)
 #define KSMBD_SHARE_INVALID_GID        ((__u16)-1)
 
-static inline int share_config_create_mode(struct ksmbd_share_config *share,
-                                          umode_t posix_mode)
+static inline umode_t
+share_config_create_mode(struct ksmbd_share_config *share,
+                        umode_t posix_mode)
 {
-       if (!share->force_create_mode) {
-               if (!posix_mode)
-                       return share->create_mask;
-               else
-                       return posix_mode & share->create_mask;
-       }
-       return share->force_create_mode & share->create_mask;
+       umode_t mode = (posix_mode ?: (umode_t)-1) & share->create_mask;
+
+       return mode | share->force_create_mode;
 }
 
-static inline int share_config_directory_mode(struct ksmbd_share_config *share,
-                                             umode_t posix_mode)
+static inline umode_t
+share_config_directory_mode(struct ksmbd_share_config *share,
+                           umode_t posix_mode)
 {
-       if (!share->force_directory_mode) {
-               if (!posix_mode)
-                       return share->directory_mask;
-               else
-                       return posix_mode & share->directory_mask;
-       }
+       umode_t mode = (posix_mode ?: (umode_t)-1) & share->directory_mask;
 
-       return share->force_directory_mode & share->directory_mask;
+       return mode | share->force_directory_mode;
 }
 
 static inline int test_share_config_flag(struct ksmbd_share_config *share,