smb/client: check whether smb2_error_map_table is sorted in ascending order
authorChenXiaoSong <chenxiaosong@kylinos.cn>
Wed, 24 Dec 2025 01:33:28 +0000 (09:33 +0800)
committerSteve French <stfrench@microsoft.com>
Mon, 9 Feb 2026 03:24:41 +0000 (21:24 -0600)
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.

Suggested-by: David Howells <dhowells@redhat.com>
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Reviewed-by: David Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/linux-cifs/20260106071507.1420900-4-chenxiaosong.chenxiaosong@linux.dev/
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cifsfs.c
fs/smb/client/smb2maperror.c
fs/smb/client/smb2proto.h

index c96d09b..87d8c93 100644 (file)
@@ -1904,6 +1904,11 @@ static int __init
 init_cifs(void)
 {
        int rc = 0;
+
+       rc = smb2_init_maperror();
+       if (rc)
+               return rc;
+
        cifs_proc_init();
        INIT_LIST_HEAD(&cifs_tcp_ses_list);
 /*
index 42fec9a..c36cfe7 100644 (file)
@@ -75,3 +75,20 @@ map_smb2_to_linux_error(char *buf, bool log_err)
                smb_EIO1(smb_eio_trace_smb2_received_error, le32_to_cpu(smb2err));
        return rc;
 }
+
+int __init smb2_init_maperror(void)
+{
+       unsigned int i;
+
+       /* Check whether the array is sorted in ascending order */
+       for (i = 1; i < ARRAY_SIZE(smb2_error_map_table); i++) {
+               if (smb2_error_map_table[i].smb2_status >=
+                   smb2_error_map_table[i - 1].smb2_status)
+                       continue;
+
+               pr_err("smb2_error_map_table array order is incorrect\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
index abd62cb..c7759e3 100644 (file)
@@ -23,6 +23,7 @@ struct smb_rqst;
  *****************************************************************
  */
 int map_smb2_to_linux_error(char *buf, bool log_err);
+int smb2_init_maperror(void);
 int smb2_check_message(char *buf, unsigned int pdu_len, unsigned int len,
                       struct TCP_Server_Info *server);
 unsigned int smb2_calc_size(void *buf);