162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright (C) 2021. Huawei Technologies Co., Ltd */
362306a36Sopenharmony_ci#include <stdbool.h>
462306a36Sopenharmony_ci#include <linux/types.h>
562306a36Sopenharmony_ci#include <linux/bpf.h>
662306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
762306a36Sopenharmony_ci#include <bpf/bpf_tracing.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define STRNCMP_STR_SZ 8
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciconst char target[STRNCMP_STR_SZ] = "EEEEEEE";
1262306a36Sopenharmony_cichar str[STRNCMP_STR_SZ];
1362306a36Sopenharmony_ciint cmp_ret = 0;
1462306a36Sopenharmony_ciint target_pid = 0;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciconst char no_str_target[STRNCMP_STR_SZ] = "12345678";
1762306a36Sopenharmony_cichar writable_target[STRNCMP_STR_SZ];
1862306a36Sopenharmony_ciunsigned int no_const_str_size = STRNCMP_STR_SZ;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciSEC("?tp/syscalls/sys_enter_nanosleep")
2362306a36Sopenharmony_ciint do_strncmp(void *ctx)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	if ((bpf_get_current_pid_tgid() >> 32) != target_pid)
2662306a36Sopenharmony_ci		return 0;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	cmp_ret = bpf_strncmp(str, STRNCMP_STR_SZ, target);
2962306a36Sopenharmony_ci	return 0;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciSEC("?tp/syscalls/sys_enter_nanosleep")
3362306a36Sopenharmony_ciint strncmp_bad_not_const_str_size(void *ctx)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	/* The value of string size is not const, so will fail */
3662306a36Sopenharmony_ci	cmp_ret = bpf_strncmp(str, no_const_str_size, target);
3762306a36Sopenharmony_ci	return 0;
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciSEC("?tp/syscalls/sys_enter_nanosleep")
4162306a36Sopenharmony_ciint strncmp_bad_writable_target(void *ctx)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	/* Compared target is not read-only, so will fail */
4462306a36Sopenharmony_ci	cmp_ret = bpf_strncmp(str, STRNCMP_STR_SZ, writable_target);
4562306a36Sopenharmony_ci	return 0;
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciSEC("?tp/syscalls/sys_enter_nanosleep")
4962306a36Sopenharmony_ciint strncmp_bad_not_null_term_target(void *ctx)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	/* Compared target is not null-terminated, so will fail */
5262306a36Sopenharmony_ci	cmp_ret = bpf_strncmp(str, STRNCMP_STR_SZ, no_str_target);
5362306a36Sopenharmony_ci	return 0;
5462306a36Sopenharmony_ci}
55