Commit c5fb1993 authored by Hou Tao's avatar Hou Tao Committed by Alexei Starovoitov
Browse files

bpf: Add bpf_strncmp helper



The helper compares two strings: one string is a null-terminated
read-only string, and another string has const max storage size
but doesn't need to be null-terminated. It can be used to compare
file name in tracing or LSM program.

Signed-off-by: default avatarHou Tao <houtao1@huawei.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211210141652.877186-2-houtao1@huawei.com
parent 259172bb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2163,6 +2163,7 @@ extern const struct bpf_func_proto bpf_sk_getsockopt_proto;
extern const struct bpf_func_proto bpf_kallsyms_lookup_name_proto;
extern const struct bpf_func_proto bpf_find_vma_proto;
extern const struct bpf_func_proto bpf_loop_proto;
extern const struct bpf_func_proto bpf_strncmp_proto;

const struct bpf_func_proto *tracing_prog_func_proto(
  enum bpf_func_id func_id, const struct bpf_prog *prog);
+11 −0
Original line number Diff line number Diff line
@@ -4983,6 +4983,16 @@ union bpf_attr {
 *	Return
 *		The number of loops performed, **-EINVAL** for invalid **flags**,
 *		**-E2BIG** if **nr_loops** exceeds the maximum number of loops.
 *
 * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2)
 *	Description
 *		Do strncmp() between **s1** and **s2**. **s1** doesn't need
 *		to be null-terminated and **s1_sz** is the maximum storage
 *		size of **s1**. **s2** must be a read-only string.
 *	Return
 *		An integer less than, equal to, or greater than zero
 *		if the first **s1_sz** bytes of **s1** is found to be
 *		less than, to match, or be greater than **s2**.
 */
#define __BPF_FUNC_MAPPER(FN)		\
	FN(unspec),			\
@@ -5167,6 +5177,7 @@ union bpf_attr {
	FN(kallsyms_lookup_name),	\
	FN(find_vma),			\
	FN(loop),			\
	FN(strncmp),			\
	/* */

/* integer value in 'imm' field of BPF_CALL instruction selects which helper
+16 −0
Original line number Diff line number Diff line
@@ -565,6 +565,20 @@ const struct bpf_func_proto bpf_strtoul_proto = {
};
#endif

BPF_CALL_3(bpf_strncmp, const char *, s1, u32, s1_sz, const char *, s2)
{
	return strncmp(s1, s2, s1_sz);
}

const struct bpf_func_proto bpf_strncmp_proto = {
	.func		= bpf_strncmp,
	.gpl_only	= false,
	.ret_type	= RET_INTEGER,
	.arg1_type	= ARG_PTR_TO_MEM,
	.arg2_type	= ARG_CONST_SIZE,
	.arg3_type	= ARG_PTR_TO_CONST_STR,
};

BPF_CALL_4(bpf_get_ns_current_pid_tgid, u64, dev, u64, ino,
	   struct bpf_pidns_info *, nsdata, u32, size)
{
@@ -1378,6 +1392,8 @@ bpf_base_func_proto(enum bpf_func_id func_id)
		return &bpf_for_each_map_elem_proto;
	case BPF_FUNC_loop:
		return &bpf_loop_proto;
	case BPF_FUNC_strncmp:
		return &bpf_strncmp_proto;
	default:
		break;
	}
+11 −0
Original line number Diff line number Diff line
@@ -4983,6 +4983,16 @@ union bpf_attr {
 *	Return
 *		The number of loops performed, **-EINVAL** for invalid **flags**,
 *		**-E2BIG** if **nr_loops** exceeds the maximum number of loops.
 *
 * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2)
 *	Description
 *		Do strncmp() between **s1** and **s2**. **s1** doesn't need
 *		to be null-terminated and **s1_sz** is the maximum storage
 *		size of **s1**. **s2** must be a read-only string.
 *	Return
 *		An integer less than, equal to, or greater than zero
 *		if the first **s1_sz** bytes of **s1** is found to be
 *		less than, to match, or be greater than **s2**.
 */
#define __BPF_FUNC_MAPPER(FN)		\
	FN(unspec),			\
@@ -5167,6 +5177,7 @@ union bpf_attr {
	FN(kallsyms_lookup_name),	\
	FN(find_vma),			\
	FN(loop),			\
	FN(strncmp),			\
	/* */

/* integer value in 'imm' field of BPF_CALL instruction selects which helper