perf trace augmented_syscalls: Add augmented_sockaddr_syscall_enter()

From the one for 'connect', so that we can use it with sendto and others
that receive a 'struct sockaddr'.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-8bdqv1q0ndcjl1nqns5r5je2@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2018-08-28 16:39:11 -03:00
parent d5a7e6613b
commit 24a6c2cd1d
1 changed files with 26 additions and 20 deletions

View File

@ -95,6 +95,31 @@ struct syscall_enter_newstat_args {
augmented_filename_syscall_enter(newstat);
#ifndef _K_SS_MAXSIZE
#define _K_SS_MAXSIZE 128
#endif
#define augmented_sockaddr_syscall_enter(syscall) \
struct augmented_enter_##syscall##_args { \
struct syscall_enter_##syscall##_args args; \
struct sockaddr_storage addr; \
}; \
int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \
{ \
struct augmented_enter_##syscall##_args augmented_args; \
unsigned long addrlen = sizeof(augmented_args.addr); \
probe_read(&augmented_args.args, sizeof(augmented_args.args), args); \
/* FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK */ \
/* if (addrlen > augmented_args.args.addrlen) */ \
/* addrlen = augmented_args.args.addrlen; */ \
/* */ \
probe_read(&augmented_args.addr, addrlen, args->addr_ptr); \
perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, \
&augmented_args, \
sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen); \
return 0; \
}
struct sockaddr;
struct syscall_enter_connect_args {
@ -105,25 +130,6 @@ struct syscall_enter_connect_args {
unsigned long addrlen;
};
struct augmented_enter_connect_args {
struct syscall_enter_connect_args args;
struct sockaddr_storage addr;
};
int syscall_enter(connect)(struct syscall_enter_connect_args *args)
{
struct augmented_enter_connect_args augmented_args;
unsigned long addrlen = sizeof(augmented_args.addr);
probe_read(&augmented_args.args, sizeof(augmented_args.args), args);
#ifdef FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK
if (addrlen > augmented_args.args.addrlen)
addrlen = augmented_args.args.addrlen;
#endif
probe_read(&augmented_args.addr, addrlen, args->addr_ptr);
perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, &augmented_args,
sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen);
return 0;
}
augmented_sockaddr_syscall_enter(connect);
license(GPL);