brintos

brintos / linux-shallow public Read only

0
0
Text · 3.4 KiB · baceb0d Raw
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