Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (C) 2021. Huawei Technologies Co., Ltd */
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  * Compare str and target after making str[i] != target[i].
0022  * When exp is -1, make str[i] < target[i] and delta = -1.
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     /* Empty str */
0066     skel->bss->str[0] = '\0';
0067     got = trigger_strncmp(skel);
0068     ASSERT_EQ(got, -1, "strncmp: empty str");
0069 
0070     /* Same string */
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     /* Not-null-termainted string  */
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 }