149 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (C) 2021. Huawei Technologies Co., Ltd */3#include <test_progs.h>4#include "strncmp_test.skel.h"5 6static 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 */24static 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 44static 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);83out:84 strncmp_test__destroy(skel);85}86 87static 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 104static 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 121static 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 138void 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}149