]> Git Repo - J-linux.git/blob - tools/testing/selftests/bpf/prog_tests/test_strncmp.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / testing / selftests / bpf / prog_tests / test_strncmp.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2021. Huawei Technologies Co., Ltd */
3 #include <test_progs.h>
4 #include "strncmp_test.skel.h"
5
6 static int trigger_strncmp(const struct strncmp_test *skel)
7 {
8         int cmp;
9
10         usleep(1);
11
12         cmp = skel->bss->cmp_ret;
13         if (cmp > 0)
14                 return 1;
15         if (cmp < 0)
16                 return -1;
17         return 0;
18 }
19
20 /*
21  * Compare str and target after making str[i] != target[i].
22  * When exp is -1, make str[i] < target[i] and delta = -1.
23  */
24 static void strncmp_full_str_cmp(struct strncmp_test *skel, const char *name,
25                                  int exp)
26 {
27         size_t nr = sizeof(skel->bss->str);
28         char *str = skel->bss->str;
29         int delta = exp;
30         int got;
31         size_t i;
32
33         memcpy(str, skel->rodata->target, nr);
34         for (i = 0; i < nr - 1; i++) {
35                 str[i] += delta;
36
37                 got = trigger_strncmp(skel);
38                 ASSERT_EQ(got, exp, name);
39
40                 str[i] -= delta;
41         }
42 }
43
44 static void test_strncmp_ret(void)
45 {
46         struct strncmp_test *skel;
47         int err, got;
48
49         skel = strncmp_test__open();
50         if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
51                 return;
52
53         bpf_program__set_autoload(skel->progs.do_strncmp, true);
54
55         err = strncmp_test__load(skel);
56         if (!ASSERT_EQ(err, 0, "strncmp_test load"))
57                 goto out;
58
59         err = strncmp_test__attach(skel);
60         if (!ASSERT_EQ(err, 0, "strncmp_test attach"))
61                 goto out;
62
63         skel->bss->target_pid = getpid();
64
65         /* Empty str */
66         skel->bss->str[0] = '\0';
67         got = trigger_strncmp(skel);
68         ASSERT_EQ(got, -1, "strncmp: empty str");
69
70         /* Same string */
71         memcpy(skel->bss->str, skel->rodata->target, sizeof(skel->bss->str));
72         got = trigger_strncmp(skel);
73         ASSERT_EQ(got, 0, "strncmp: same str");
74
75         /* Not-null-terminated string  */
76         memcpy(skel->bss->str, skel->rodata->target, sizeof(skel->bss->str));
77         skel->bss->str[sizeof(skel->bss->str) - 1] = 'A';
78         got = trigger_strncmp(skel);
79         ASSERT_EQ(got, 1, "strncmp: not-null-term str");
80
81         strncmp_full_str_cmp(skel, "strncmp: less than", -1);
82         strncmp_full_str_cmp(skel, "strncmp: greater than", 1);
83 out:
84         strncmp_test__destroy(skel);
85 }
86
87 static void test_strncmp_bad_not_const_str_size(void)
88 {
89         struct strncmp_test *skel;
90         int err;
91
92         skel = strncmp_test__open();
93         if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
94                 return;
95
96         bpf_program__set_autoload(skel->progs.strncmp_bad_not_const_str_size, true);
97
98         err = strncmp_test__load(skel);
99         ASSERT_ERR(err, "strncmp_test load bad_not_const_str_size");
100
101         strncmp_test__destroy(skel);
102 }
103
104 static void test_strncmp_bad_writable_target(void)
105 {
106         struct strncmp_test *skel;
107         int err;
108
109         skel = strncmp_test__open();
110         if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
111                 return;
112
113         bpf_program__set_autoload(skel->progs.strncmp_bad_writable_target, true);
114
115         err = strncmp_test__load(skel);
116         ASSERT_ERR(err, "strncmp_test load bad_writable_target");
117
118         strncmp_test__destroy(skel);
119 }
120
121 static void test_strncmp_bad_not_null_term_target(void)
122 {
123         struct strncmp_test *skel;
124         int err;
125
126         skel = strncmp_test__open();
127         if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
128                 return;
129
130         bpf_program__set_autoload(skel->progs.strncmp_bad_not_null_term_target, true);
131
132         err = strncmp_test__load(skel);
133         ASSERT_ERR(err, "strncmp_test load bad_not_null_term_target");
134
135         strncmp_test__destroy(skel);
136 }
137
138 void test_test_strncmp(void)
139 {
140         if (test__start_subtest("strncmp_ret"))
141                 test_strncmp_ret();
142         if (test__start_subtest("strncmp_bad_not_const_str_size"))
143                 test_strncmp_bad_not_const_str_size();
144         if (test__start_subtest("strncmp_bad_writable_target"))
145                 test_strncmp_bad_writable_target();
146         if (test__start_subtest("strncmp_bad_not_null_term_target"))
147                 test_strncmp_bad_not_null_term_target();
148 }
This page took 0.035623 seconds and 4 git commands to generate.