[PATCH v2 07/12] smb/client: introduce KUnit test to check ntstatus_to_dos_map search

huiwen.he
2026-04-01T07:30:43Z

From: Youling Tang <tangyouling@kylinos.cn>

Check whether all elements can be correctly found in the array.

Introduce CONFIG_SMB1_KUNIT_TESTS for smb1maperror_test.ko since
smb1maperror.o is only built when CONFIG_CIFS_ALLOW_INSECURE_LEGACY
is enabled.

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

Signed-off-by: Youling Tang <tangyouling@kylinos.cn>
Reviewed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
fs/smb/client/Kconfig | 11 ++++++
fs/smb/client/Makefile | 1 +
fs/smb/client/smb1maperror.c | 19 ++++++++++
fs/smb/client/smb1maperror_test.c | 61 +++++++++++++++++++++++++++++++
fs/smb/client/smb1proto.h | 4 ++
5 files changed, 96 insertions(+)
create mode 100644 fs/smb/client/smb1maperror_test.c

diff --git a/fs/smb/client/Kconfig b/fs/smb/client/Kconfig
index 17bd368574e9..2e72d3c8423f 100644
--- a/fs/smb/client/Kconfig
+++ b/fs/smb/client/Kconfig
@@ -217,4 +217,15 @@ config CIFS_COMPRESSION
Say Y here if you want SMB traffic to be compressed.
If unsure, say N.

+config SMB1_KUNIT_TESTS
+ tristate "KUnit tests for SMB1"
+ depends on SMB_KUNIT_TESTS && CIFS_ALLOW_INSECURE_LEGACY
+ default SMB_KUNIT_TESTS
+ help
+ This builds the SMB1-specific KUnit tests.
+
+ These tests are only enabled when legacy insecure SMB1 support
+ (CIFS_ALLOW_INSECURE_LEGACY) is enabled.
+
+ If unsure, say N.
endif
diff --git a/fs/smb/client/Makefile b/fs/smb/client/Makefile
index 8560fe99ec2b..220a97c8a488 100644
--- a/fs/smb/client/Makefile
+++ b/fs/smb/client/Makefile
@@ -71,6 +71,7 @@ $(obj)/smb2maperror.o: $(obj)/smb2_mapping_table.c
quiet_cmd_gen_smb2_mapping = GEN $@
cmd_gen_smb2_mapping = perl $(src)/gen_smb2_mapping $< $@

+obj-$(CONFIG_SMB1_KUNIT_TESTS) += smb1maperror_test.o
obj-$(CONFIG_SMB_KUNIT_TESTS) += smb2maperror_test.o

# Let Kbuild handle tracking and cleaning
diff --git a/fs/smb/client/smb1maperror.c b/fs/smb/client/smb1maperror.c
index 0a945f9bf8de..499cacfeba6d 100644
--- a/fs/smb/client/smb1maperror.c
+++ b/fs/smb/client/smb1maperror.c
@@ -288,3 +288,22 @@ int __init smb1_init_maperror(void)

return rc;
}
+
+#if IS_ENABLED(CONFIG_SMB1_KUNIT_TESTS)
+#define EXPORT_SYMBOL_FOR_SMB_TEST(sym) \
+ EXPORT_SYMBOL_FOR_MODULES(sym, "smb1maperror_test")
+
+const struct ntstatus_to_dos_err *
+search_ntstatus_to_dos_map_test(__u32 ntstatus)
+{
+ return search_ntstatus_to_dos_map(ntstatus);
+}
+EXPORT_SYMBOL_FOR_SMB_TEST(search_ntstatus_to_dos_map_test);
+
+const struct ntstatus_to_dos_err *
+ntstatus_to_dos_map_test = ntstatus_to_dos_map;
+EXPORT_SYMBOL_FOR_SMB_TEST(ntstatus_to_dos_map_test);
+
+unsigned int ntstatus_to_dos_num = ARRAY_SIZE(ntstatus_to_dos_map);
+EXPORT_SYMBOL_FOR_SMB_TEST(ntstatus_to_dos_num);
+#endif
diff --git a/fs/smb/client/smb1maperror_test.c b/fs/smb/client/smb1maperror_test.c
new file mode 100644
index 000000000000..f25008d149f5
--- /dev/null
+++ b/fs/smb/client/smb1maperror_test.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *
+ * KUnit tests of SMB1 maperror
+ *
+ * Copyright (C) 2026 KylinSoft Co., Ltd. All rights reserved.
+ * Author(s): Youling Tang <tangyouling@kylinos.cn>
+ * ChenXiaoSong <chenxiaosong@kylinos.cn>
+ *
+ */
+
+#include <kunit/test.h>
+#include "smb1proto.h"
+#include "nterr.h"
+
+extern const struct ntstatus_to_dos_err *ntstatus_to_dos_map_test;
+extern unsigned int ntstatus_to_dos_num;
+
+#define DEFINE_CHECK_SEARCH_FUNC(__struct_name, __field, \
+ __array, __num) \
+static void check_search_ ## __array(struct kunit *test) \
+{ \
+ unsigned int i; \
+ const struct __struct_name *expect, *result; \
+ \
+ for (i = 0; i < __num; i++) { \
+ expect = &__array ## _test[i]; \
+ result = search_ ## __array ## _test(expect->__field); \
+ KUNIT_EXPECT_PTR_NE(test, NULL, result); \
+ test_cmp_ ## __struct_name(test, expect, result); \
+ } \
+}
+
+static void
+test_cmp_ntstatus_to_dos_err(struct kunit *test,
+ const struct ntstatus_to_dos_err *expect,
+ const struct ntstatus_to_dos_err *result)
+{
+ KUNIT_EXPECT_EQ(test, expect->dos_class, result->dos_class);
+ KUNIT_EXPECT_EQ(test, expect->dos_code, result->dos_code);
+ KUNIT_EXPECT_EQ(test, expect->ntstatus, result->ntstatus);
+ KUNIT_EXPECT_STREQ(test, expect->nt_errstr, result->nt_errstr);
+}
+
+/* check_search_ntstatus_to_dos_map */
+DEFINE_CHECK_SEARCH_FUNC(ntstatus_to_dos_err, ntstatus, ntstatus_to_dos_map,
+ ntstatus_to_dos_num);
+
+static struct kunit_case maperror_test_cases[] = {
+ KUNIT_CASE(check_search_ntstatus_to_dos_map),
+ {}
+};
+
+static struct kunit_suite maperror_suite = {
+ .name = "smb1_maperror",
+ .test_cases = maperror_test_cases,
+};
+
+kunit_test_suite(maperror_suite);
+
+MODULE_LICENSE("GPL");
diff --git a/fs/smb/client/smb1proto.h b/fs/smb/client/smb1proto.h
index dd98d04e837a..43b773e7964b 100644
--- a/fs/smb/client/smb1proto.h
+++ b/fs/smb/client/smb1proto.h
@@ -237,6 +237,10 @@ 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);
+#if IS_ENABLED(CONFIG_SMB1_KUNIT_TESTS)
+const struct ntstatus_to_dos_err *
+search_ntstatus_to_dos_map_test(__u32 ntstatus);
+#endif

/*
* smb1misc.c
--
2.52.0