Skip to content

Commit

Permalink
perf bpf augmented_raw_syscalls: Add an assert to make sure sizeof(sa…
Browse files Browse the repository at this point in the history
…ddr) is a power of two.

We're using the BPF verifier suggestion:

    22: (85) call bpf_probe_read#4
    R2 min value is negative, either use unsigned or 'var &= const'

That works only when const is a (power of two - 1) so add an assert to
make sure that that is the case.

Suggested-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/lkml/ZONrFmJBNlQpSpZj@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
acmel committed Aug 21, 2023
1 parent a50b8db commit 262b54b
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions tools/perf/util/bpf_skel/augmented_raw_syscalls.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@
#include <bpf/bpf_helpers.h>
#include <linux/limits.h>

/**
* is_power_of_2() - check if a value is a power of two
* @n: the value to check
*
* Determine whether some value is a power of two, where zero is *not*
* considered a power of two. Return: true if @n is a power of 2, otherwise
* false.
*/
#define is_power_of_2(n) (n != 0 && ((n & (n - 1)) == 0))

#define MAX_CPUS 4096

// FIXME: These should come from system headers
Expand Down Expand Up @@ -187,6 +197,7 @@ int sys_enter_connect(struct syscall_enter_args *args)
if (augmented_args == NULL)
return 1; /* Failure: don't filter */

_Static_assert(is_power_of_2(sizeof(augmented_args->saddr)), "sizeof(augmented_args->saddr) needs to be a power of two");
socklen &= sizeof(augmented_args->saddr) - 1;

bpf_probe_read(&augmented_args->saddr, socklen, sockaddr_arg);
Expand Down

0 comments on commit 262b54b

Please sign in to comment.