1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2025. Huawei Technologies Co., Ltd */
3
4 #include <linux/bpf.h>
5 #include <bpf/bpf_helpers.h>
6 #include "bpf_misc.h"
7
8 char _license[] SEC("license") = "GPL";
9
10 struct {
11 __uint(type, BPF_MAP_TYPE_RINGBUF);
12 __uint(map_flags, BPF_F_RB_OVERWRITE);
13 } ringbuf SEC(".maps");
14
15 int pid;
16
17 const volatile unsigned long LEN1;
18 const volatile unsigned long LEN2;
19 const volatile unsigned long LEN3;
20 const volatile unsigned long LEN4;
21 const volatile unsigned long LEN5;
22
23 long reserve1_fail = 0;
24 long reserve2_fail = 0;
25 long reserve3_fail = 0;
26 long reserve4_fail = 0;
27 long reserve5_fail = 0;
28
29 unsigned long avail_data = 0;
30 unsigned long ring_size = 0;
31 unsigned long cons_pos = 0;
32 unsigned long prod_pos = 0;
33 unsigned long over_pos = 0;
34
35 SEC("fentry/" SYS_PREFIX "sys_getpgid")
test_overwrite_ringbuf(void * ctx)36 int test_overwrite_ringbuf(void *ctx)
37 {
38 char *rec1, *rec2, *rec3, *rec4, *rec5;
39 int cur_pid = bpf_get_current_pid_tgid() >> 32;
40
41 if (cur_pid != pid)
42 return 0;
43
44 rec1 = bpf_ringbuf_reserve(&ringbuf, LEN1, 0);
45 if (!rec1) {
46 reserve1_fail = 1;
47 return 0;
48 }
49
50 rec2 = bpf_ringbuf_reserve(&ringbuf, LEN2, 0);
51 if (!rec2) {
52 bpf_ringbuf_discard(rec1, 0);
53 reserve2_fail = 1;
54 return 0;
55 }
56
57 rec3 = bpf_ringbuf_reserve(&ringbuf, LEN3, 0);
58 /* expect failure */
59 if (!rec3) {
60 reserve3_fail = 1;
61 } else {
62 bpf_ringbuf_discard(rec1, 0);
63 bpf_ringbuf_discard(rec2, 0);
64 bpf_ringbuf_discard(rec3, 0);
65 return 0;
66 }
67
68 rec4 = bpf_ringbuf_reserve(&ringbuf, LEN4, 0);
69 if (!rec4) {
70 reserve4_fail = 1;
71 bpf_ringbuf_discard(rec1, 0);
72 bpf_ringbuf_discard(rec2, 0);
73 return 0;
74 }
75
76 bpf_ringbuf_submit(rec1, 0);
77 bpf_ringbuf_submit(rec2, 0);
78 bpf_ringbuf_submit(rec4, 0);
79
80 rec5 = bpf_ringbuf_reserve(&ringbuf, LEN5, 0);
81 if (!rec5) {
82 reserve5_fail = 1;
83 return 0;
84 }
85
86 for (int i = 0; i < LEN3; i++)
87 rec5[i] = 0xdd;
88
89 bpf_ringbuf_submit(rec5, 0);
90
91 ring_size = bpf_ringbuf_query(&ringbuf, BPF_RB_RING_SIZE);
92 avail_data = bpf_ringbuf_query(&ringbuf, BPF_RB_AVAIL_DATA);
93 cons_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_CONS_POS);
94 prod_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_PROD_POS);
95 over_pos = bpf_ringbuf_query(&ringbuf, BPF_RB_OVERWRITE_POS);
96
97 return 0;
98 }
99