]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb/client: check if ntstatus_to_dos_map is sorted
authorYouling Tang <tangyouling@kylinos.cn>
Thu, 2 Apr 2026 14:18:32 +0000 (14:18 +0000)
committerSteve French <stfrench@microsoft.com>
Mon, 6 Apr 2026 00:58:40 +0000 (19:58 -0500)
Although the array is sorted at build time, verify the ordering again
when cifs.ko is loaded to avoid potential regressions introduced by
future script changes.

We are going to define 3 functions to check the sort results, introduce the
macro DEFINE_CHECK_SORT_FUNC() to reduce duplicate code.

Signed-off-by: Youling Tang <tangyouling@kylinos.cn>
Reviewed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsfs.c
fs/smb/client/smb1maperror.c
fs/smb/client/smb1proto.h

index 32d0305a1239adbf8dc9ca7014414021ec635244..3e1dbc28af7d9834bce15297e821d2e5d6cec866 100644 (file)
@@ -1911,6 +1911,12 @@ init_cifs(void)
 {
        int rc = 0;
 
+#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
+       rc = smb1_init_maperror();
+       if (rc)
+               return rc;
+#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
+
        rc = smb2_init_maperror();
        if (rc)
                return rc;
index fb985d2fc0d97b1121795f827f042bd86d0945c2..66ceebbe535ed6df1cdab78bd7ec7acfef03486f 100644 (file)
@@ -256,3 +256,35 @@ map_and_check_smb_error(struct TCP_Server_Info *server,
 
        return rc;
 }
+
+#define DEFINE_CHECK_SORT_FUNC(__array, __field)                       \
+static int __init __array ## _is_sorted(void)                          \
+{                                                                      \
+       unsigned int i;                                                 \
+                                                                       \
+       /* Check whether the array is sorted in ascending order */      \
+       for (i = 1; i < ARRAY_SIZE(__array); i++) {                     \
+               if (__array[i].__field >=                               \
+                   __array[i - 1].__field)                             \
+                       continue;                                       \
+                                                                       \
+               pr_err(#__array " array order is incorrect\n");         \
+               return -EINVAL;                                         \
+       }                                                               \
+                                                                       \
+       return 0;                                                       \
+}
+
+/* ntstatus_to_dos_map_is_sorted */
+DEFINE_CHECK_SORT_FUNC(ntstatus_to_dos_map, ntstatus);
+
+int __init smb1_init_maperror(void)
+{
+       int rc;
+
+       rc = ntstatus_to_dos_map_is_sorted();
+       if (rc)
+               return rc;
+
+       return rc;
+}
index 42569bbcf6fdce917b8b9c072688ddad85dbc1fb..dd98d04e837aa8a224405a23191d10a928c478f9 100644 (file)
@@ -234,6 +234,7 @@ int cifs_verify_signature(struct smb_rqst *rqst,
  * smb1maperror.c
  */
 int map_smb_to_linux_error(char *buf, bool logErr);
+int smb1_init_maperror(void);
 int map_and_check_smb_error(struct TCP_Server_Info *server,
                            struct mid_q_entry *mid, bool logErr);