15e85c6bbSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
25e85c6bbSAndrii Nakryiko /* Copyright (c) 2020 Facebook */
35e85c6bbSAndrii Nakryiko
45e85c6bbSAndrii Nakryiko #include "vmlinux.h"
55e85c6bbSAndrii Nakryiko #include <bpf/bpf_helpers.h>
65e85c6bbSAndrii Nakryiko #include <bpf/bpf_tracing.h>
75e85c6bbSAndrii Nakryiko #include <bpf/bpf_core_read.h>
85e85c6bbSAndrii Nakryiko
95e85c6bbSAndrii Nakryiko #define MAX_LEN 256
105e85c6bbSAndrii Nakryiko
115e85c6bbSAndrii Nakryiko char buf_in1[MAX_LEN] = {};
125e85c6bbSAndrii Nakryiko char buf_in2[MAX_LEN] = {};
135e85c6bbSAndrii Nakryiko
145e85c6bbSAndrii Nakryiko int test_pid = 0;
155e85c6bbSAndrii Nakryiko bool capture = false;
165e85c6bbSAndrii Nakryiko
175e85c6bbSAndrii Nakryiko /* .bss */
184fccd2ffSAndrii Nakryiko __u64 payload1_len1 = 0;
194fccd2ffSAndrii Nakryiko __u64 payload1_len2 = 0;
204fccd2ffSAndrii Nakryiko __u64 total1 = 0;
215e85c6bbSAndrii Nakryiko char payload1[MAX_LEN + MAX_LEN] = {};
22*9cd09482SAlban Crequy __u64 ret_bad_read = 0;
235e85c6bbSAndrii Nakryiko
245e85c6bbSAndrii Nakryiko /* .data */
255e85c6bbSAndrii Nakryiko int payload2_len1 = -1;
265e85c6bbSAndrii Nakryiko int payload2_len2 = -1;
275e85c6bbSAndrii Nakryiko int total2 = -1;
285e85c6bbSAndrii Nakryiko char payload2[MAX_LEN + MAX_LEN] = { 1 };
295e85c6bbSAndrii Nakryiko
302fde1747SJohn Fastabend int payload3_len1 = -1;
312fde1747SJohn Fastabend int payload3_len2 = -1;
322fde1747SJohn Fastabend int total3= -1;
332fde1747SJohn Fastabend char payload3[MAX_LEN + MAX_LEN] = { 1 };
342fde1747SJohn Fastabend
352fde1747SJohn Fastabend int payload4_len1 = -1;
362fde1747SJohn Fastabend int payload4_len2 = -1;
372fde1747SJohn Fastabend int total4= -1;
382fde1747SJohn Fastabend char payload4[MAX_LEN + MAX_LEN] = { 1 };
392fde1747SJohn Fastabend
40*9cd09482SAlban Crequy char payload_bad[5] = { 0x42, 0x42, 0x42, 0x42, 0x42 };
41*9cd09482SAlban Crequy
425e85c6bbSAndrii Nakryiko SEC("raw_tp/sys_enter")
handler64_unsigned(void * regs)432fde1747SJohn Fastabend int handler64_unsigned(void *regs)
445e85c6bbSAndrii Nakryiko {
455e85c6bbSAndrii Nakryiko int pid = bpf_get_current_pid_tgid() >> 32;
465e85c6bbSAndrii Nakryiko void *payload = payload1;
4796752e1eSYonghong Song long len;
485e85c6bbSAndrii Nakryiko
495e85c6bbSAndrii Nakryiko /* ignore irrelevant invocations */
505e85c6bbSAndrii Nakryiko if (test_pid != pid || !capture)
515e85c6bbSAndrii Nakryiko return 0;
525e85c6bbSAndrii Nakryiko
535e85c6bbSAndrii Nakryiko len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
5496752e1eSYonghong Song if (len >= 0) {
555e85c6bbSAndrii Nakryiko payload += len;
565e85c6bbSAndrii Nakryiko payload1_len1 = len;
575e85c6bbSAndrii Nakryiko }
585e85c6bbSAndrii Nakryiko
595e85c6bbSAndrii Nakryiko len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
6096752e1eSYonghong Song if (len >= 0) {
615e85c6bbSAndrii Nakryiko payload += len;
625e85c6bbSAndrii Nakryiko payload1_len2 = len;
635e85c6bbSAndrii Nakryiko }
645e85c6bbSAndrii Nakryiko
655e85c6bbSAndrii Nakryiko total1 = payload - (void *)payload1;
665e85c6bbSAndrii Nakryiko
67*9cd09482SAlban Crequy ret_bad_read = bpf_probe_read_kernel_str(payload_bad + 2, 1, (void *) -1);
68*9cd09482SAlban Crequy
695e85c6bbSAndrii Nakryiko return 0;
705e85c6bbSAndrii Nakryiko }
715e85c6bbSAndrii Nakryiko
722fde1747SJohn Fastabend SEC("raw_tp/sys_exit")
handler64_signed(void * regs)732fde1747SJohn Fastabend int handler64_signed(void *regs)
742fde1747SJohn Fastabend {
752fde1747SJohn Fastabend int pid = bpf_get_current_pid_tgid() >> 32;
762fde1747SJohn Fastabend void *payload = payload3;
772fde1747SJohn Fastabend long len;
782fde1747SJohn Fastabend
792fde1747SJohn Fastabend /* ignore irrelevant invocations */
802fde1747SJohn Fastabend if (test_pid != pid || !capture)
812fde1747SJohn Fastabend return 0;
822fde1747SJohn Fastabend
832fde1747SJohn Fastabend len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
842fde1747SJohn Fastabend if (len >= 0) {
852fde1747SJohn Fastabend payload += len;
862fde1747SJohn Fastabend payload3_len1 = len;
872fde1747SJohn Fastabend }
882fde1747SJohn Fastabend len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
892fde1747SJohn Fastabend if (len >= 0) {
902fde1747SJohn Fastabend payload += len;
912fde1747SJohn Fastabend payload3_len2 = len;
922fde1747SJohn Fastabend }
932fde1747SJohn Fastabend total3 = payload - (void *)payload3;
942fde1747SJohn Fastabend
952fde1747SJohn Fastabend return 0;
962fde1747SJohn Fastabend }
972fde1747SJohn Fastabend
982fde1747SJohn Fastabend SEC("tp/raw_syscalls/sys_enter")
handler32_unsigned(void * regs)992fde1747SJohn Fastabend int handler32_unsigned(void *regs)
1005e85c6bbSAndrii Nakryiko {
1015e85c6bbSAndrii Nakryiko int pid = bpf_get_current_pid_tgid() >> 32;
1025e85c6bbSAndrii Nakryiko void *payload = payload2;
1035e85c6bbSAndrii Nakryiko u32 len;
1045e85c6bbSAndrii Nakryiko
1055e85c6bbSAndrii Nakryiko /* ignore irrelevant invocations */
1065e85c6bbSAndrii Nakryiko if (test_pid != pid || !capture)
1075e85c6bbSAndrii Nakryiko return 0;
1085e85c6bbSAndrii Nakryiko
1095e85c6bbSAndrii Nakryiko len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
1105e85c6bbSAndrii Nakryiko if (len <= MAX_LEN) {
1115e85c6bbSAndrii Nakryiko payload += len;
1125e85c6bbSAndrii Nakryiko payload2_len1 = len;
1135e85c6bbSAndrii Nakryiko }
1145e85c6bbSAndrii Nakryiko
1155e85c6bbSAndrii Nakryiko len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
1165e85c6bbSAndrii Nakryiko if (len <= MAX_LEN) {
1175e85c6bbSAndrii Nakryiko payload += len;
1185e85c6bbSAndrii Nakryiko payload2_len2 = len;
1195e85c6bbSAndrii Nakryiko }
1205e85c6bbSAndrii Nakryiko
1215e85c6bbSAndrii Nakryiko total2 = payload - (void *)payload2;
1225e85c6bbSAndrii Nakryiko
1235e85c6bbSAndrii Nakryiko return 0;
1245e85c6bbSAndrii Nakryiko }
1255e85c6bbSAndrii Nakryiko
1262fde1747SJohn Fastabend SEC("tp/raw_syscalls/sys_exit")
handler32_signed(void * regs)1272fde1747SJohn Fastabend int handler32_signed(void *regs)
1282fde1747SJohn Fastabend {
1292fde1747SJohn Fastabend int pid = bpf_get_current_pid_tgid() >> 32;
1302fde1747SJohn Fastabend void *payload = payload4;
13196752e1eSYonghong Song long len;
1322fde1747SJohn Fastabend
1332fde1747SJohn Fastabend /* ignore irrelevant invocations */
1342fde1747SJohn Fastabend if (test_pid != pid || !capture)
1352fde1747SJohn Fastabend return 0;
1362fde1747SJohn Fastabend
1372fde1747SJohn Fastabend len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
1382fde1747SJohn Fastabend if (len >= 0) {
1392fde1747SJohn Fastabend payload += len;
1402fde1747SJohn Fastabend payload4_len1 = len;
1412fde1747SJohn Fastabend }
1422fde1747SJohn Fastabend len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
1432fde1747SJohn Fastabend if (len >= 0) {
1442fde1747SJohn Fastabend payload += len;
1452fde1747SJohn Fastabend payload4_len2 = len;
1462fde1747SJohn Fastabend }
1472fde1747SJohn Fastabend total4 = payload - (void *)payload4;
1482fde1747SJohn Fastabend
1492fde1747SJohn Fastabend return 0;
1502fde1747SJohn Fastabend }
1512fde1747SJohn Fastabend
1522fde1747SJohn Fastabend SEC("tp/syscalls/sys_exit_getpid")
handler_exit(void * regs)1535e85c6bbSAndrii Nakryiko int handler_exit(void *regs)
1545e85c6bbSAndrii Nakryiko {
1555e85c6bbSAndrii Nakryiko long bla;
1565e85c6bbSAndrii Nakryiko
1575e85c6bbSAndrii Nakryiko if (bpf_probe_read_kernel(&bla, sizeof(bla), 0))
1585e85c6bbSAndrii Nakryiko return 1;
1595e85c6bbSAndrii Nakryiko else
1605e85c6bbSAndrii Nakryiko return 0;
1615e85c6bbSAndrii Nakryiko }
1625e85c6bbSAndrii Nakryiko
1635e85c6bbSAndrii Nakryiko char LICENSE[] SEC("license") = "GPL";
164