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: Hou Tao <houtao1@huawei.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20211210141652.877186-2-houtao1@huawei.com
This commit is contained in:
Родитель
259172bb65
Коммит
c5fb199374
|
@ -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_kallsyms_lookup_name_proto;
|
||||||
extern const struct bpf_func_proto bpf_find_vma_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_loop_proto;
|
||||||
|
extern const struct bpf_func_proto bpf_strncmp_proto;
|
||||||
|
|
||||||
const struct bpf_func_proto *tracing_prog_func_proto(
|
const struct bpf_func_proto *tracing_prog_func_proto(
|
||||||
enum bpf_func_id func_id, const struct bpf_prog *prog);
|
enum bpf_func_id func_id, const struct bpf_prog *prog);
|
||||||
|
|
|
@ -4983,6 +4983,16 @@ union bpf_attr {
|
||||||
* Return
|
* Return
|
||||||
* The number of loops performed, **-EINVAL** for invalid **flags**,
|
* The number of loops performed, **-EINVAL** for invalid **flags**,
|
||||||
* **-E2BIG** if **nr_loops** exceeds the maximum number of loops.
|
* **-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) \
|
#define __BPF_FUNC_MAPPER(FN) \
|
||||||
FN(unspec), \
|
FN(unspec), \
|
||||||
|
@ -5167,6 +5177,7 @@ union bpf_attr {
|
||||||
FN(kallsyms_lookup_name), \
|
FN(kallsyms_lookup_name), \
|
||||||
FN(find_vma), \
|
FN(find_vma), \
|
||||||
FN(loop), \
|
FN(loop), \
|
||||||
|
FN(strncmp), \
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
||||||
|
|
|
@ -565,6 +565,20 @@ const struct bpf_func_proto bpf_strtoul_proto = {
|
||||||
};
|
};
|
||||||
#endif
|
#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,
|
BPF_CALL_4(bpf_get_ns_current_pid_tgid, u64, dev, u64, ino,
|
||||||
struct bpf_pidns_info *, nsdata, u32, size)
|
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;
|
return &bpf_for_each_map_elem_proto;
|
||||||
case BPF_FUNC_loop:
|
case BPF_FUNC_loop:
|
||||||
return &bpf_loop_proto;
|
return &bpf_loop_proto;
|
||||||
|
case BPF_FUNC_strncmp:
|
||||||
|
return &bpf_strncmp_proto;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4983,6 +4983,16 @@ union bpf_attr {
|
||||||
* Return
|
* Return
|
||||||
* The number of loops performed, **-EINVAL** for invalid **flags**,
|
* The number of loops performed, **-EINVAL** for invalid **flags**,
|
||||||
* **-E2BIG** if **nr_loops** exceeds the maximum number of loops.
|
* **-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) \
|
#define __BPF_FUNC_MAPPER(FN) \
|
||||||
FN(unspec), \
|
FN(unspec), \
|
||||||
|
@ -5167,6 +5177,7 @@ union bpf_attr {
|
||||||
FN(kallsyms_lookup_name), \
|
FN(kallsyms_lookup_name), \
|
||||||
FN(find_vma), \
|
FN(find_vma), \
|
||||||
FN(loop), \
|
FN(loop), \
|
||||||
|
FN(strncmp), \
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
||||||
|
|
Загрузка…
Ссылка в новой задаче