OSDN Git Service

ksmbd: fix `force create mode' and `force directory mode'
authorAtte Heikkilä <atteh.mailbox@gmail.com>
Thu, 10 Aug 2023 20:01:32 +0000 (23:01 +0300)
committerSteve French <stfrench@microsoft.com>
Tue, 29 Aug 2023 17:30:20 +0000 (12:30 -0500)
`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>
fs/smb/server/mgmt/share_config.h

index 3fd3382..5f59175 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,