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