0001
0002
0003 #include <test_progs.h>
0004 #include "strncmp_test.skel.h"
0005
0006 static int trigger_strncmp(const struct strncmp_test *skel)
0007 {
0008 int cmp;
0009
0010 usleep(1);
0011
0012 cmp = skel->bss->cmp_ret;
0013 if (cmp > 0)
0014 return 1;
0015 if (cmp < 0)
0016 return -1;
0017 return 0;
0018 }
0019
0020
0021
0022
0023
0024 static void strncmp_full_str_cmp(struct strncmp_test *skel, const char *name,
0025 int exp)
0026 {
0027 size_t nr = sizeof(skel->bss->str);
0028 char *str = skel->bss->str;
0029 int delta = exp;
0030 int got;
0031 size_t i;
0032
0033 memcpy(str, skel->rodata->target, nr);
0034 for (i = 0; i < nr - 1; i++) {
0035 str[i] += delta;
0036
0037 got = trigger_strncmp(skel);
0038 ASSERT_EQ(got, exp, name);
0039
0040 str[i] -= delta;
0041 }
0042 }
0043
0044 static void test_strncmp_ret(void)
0045 {
0046 struct strncmp_test *skel;
0047 int err, got;
0048
0049 skel = strncmp_test__open();
0050 if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
0051 return;
0052
0053 bpf_program__set_autoload(skel->progs.do_strncmp, true);
0054
0055 err = strncmp_test__load(skel);
0056 if (!ASSERT_EQ(err, 0, "strncmp_test load"))
0057 goto out;
0058
0059 err = strncmp_test__attach(skel);
0060 if (!ASSERT_EQ(err, 0, "strncmp_test attach"))
0061 goto out;
0062
0063 skel->bss->target_pid = getpid();
0064
0065
0066 skel->bss->str[0] = '\0';
0067 got = trigger_strncmp(skel);
0068 ASSERT_EQ(got, -1, "strncmp: empty str");
0069
0070
0071 memcpy(skel->bss->str, skel->rodata->target, sizeof(skel->bss->str));
0072 got = trigger_strncmp(skel);
0073 ASSERT_EQ(got, 0, "strncmp: same str");
0074
0075
0076 memcpy(skel->bss->str, skel->rodata->target, sizeof(skel->bss->str));
0077 skel->bss->str[sizeof(skel->bss->str) - 1] = 'A';
0078 got = trigger_strncmp(skel);
0079 ASSERT_EQ(got, 1, "strncmp: not-null-term str");
0080
0081 strncmp_full_str_cmp(skel, "strncmp: less than", -1);
0082 strncmp_full_str_cmp(skel, "strncmp: greater than", 1);
0083 out:
0084 strncmp_test__destroy(skel);
0085 }
0086
0087 static void test_strncmp_bad_not_const_str_size(void)
0088 {
0089 struct strncmp_test *skel;
0090 int err;
0091
0092 skel = strncmp_test__open();
0093 if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
0094 return;
0095
0096 bpf_program__set_autoload(skel->progs.strncmp_bad_not_const_str_size, true);
0097
0098 err = strncmp_test__load(skel);
0099 ASSERT_ERR(err, "strncmp_test load bad_not_const_str_size");
0100
0101 strncmp_test__destroy(skel);
0102 }
0103
0104 static void test_strncmp_bad_writable_target(void)
0105 {
0106 struct strncmp_test *skel;
0107 int err;
0108
0109 skel = strncmp_test__open();
0110 if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
0111 return;
0112
0113 bpf_program__set_autoload(skel->progs.strncmp_bad_writable_target, true);
0114
0115 err = strncmp_test__load(skel);
0116 ASSERT_ERR(err, "strncmp_test load bad_writable_target");
0117
0118 strncmp_test__destroy(skel);
0119 }
0120
0121 static void test_strncmp_bad_not_null_term_target(void)
0122 {
0123 struct strncmp_test *skel;
0124 int err;
0125
0126 skel = strncmp_test__open();
0127 if (!ASSERT_OK_PTR(skel, "strncmp_test open"))
0128 return;
0129
0130 bpf_program__set_autoload(skel->progs.strncmp_bad_not_null_term_target, true);
0131
0132 err = strncmp_test__load(skel);
0133 ASSERT_ERR(err, "strncmp_test load bad_not_null_term_target");
0134
0135 strncmp_test__destroy(skel);
0136 }
0137
0138 void test_test_strncmp(void)
0139 {
0140 if (test__start_subtest("strncmp_ret"))
0141 test_strncmp_ret();
0142 if (test__start_subtest("strncmp_bad_not_const_str_size"))
0143 test_strncmp_bad_not_const_str_size();
0144 if (test__start_subtest("strncmp_bad_writable_target"))
0145 test_strncmp_bad_writable_target();
0146 if (test__start_subtest("strncmp_bad_not_null_term_target"))
0147 test_strncmp_bad_not_null_term_target();
0148 }