linux/tools/testing/selftests/bpf/prog_tests/test_strncmp.c
<<
>>
Prefs
   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
   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-termainted 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