libbpf: Add a check to ensure that page_cnt is non-zero
authorYuntao Wang <ytcoode@gmail.com>
Thu, 3 Mar 2022 00:59:21 +0000 (08:59 +0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 3 Mar 2022 15:23:22 +0000 (16:23 +0100)
The page_cnt parameter is used to specify the number of memory pages
allocated for each per-CPU buffer, it must be non-zero and a power of 2.

Currently, the __perf_buffer__new() function attempts to validate that
the page_cnt is a power of 2 but forgets checking for the case where
page_cnt is zero, we can fix it by replacing 'page_cnt & (page_cnt - 1)'
with 'page_cnt == 0 || (page_cnt & (page_cnt - 1))'.

If so, we also don't need to add a check in perf_buffer__new_v0_6_0() to
make sure that page_cnt is non-zero and the check for zero in
perf_buffer__new_raw_v0_6_0() can also be removed.

The code will be cleaner and more readable.

Signed-off-by: Yuntao Wang <ytcoode@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20220303005921.53436-1-ytcoode@gmail.com
tools/lib/bpf/libbpf.c

index be6480e260c422b4455a4d4a3d05972b0ece422d..81bf01d67671bfaffaf62055903da2f8a1993d2a 100644 (file)
@@ -10951,7 +10951,7 @@ struct perf_buffer *perf_buffer__new_raw_v0_6_0(int map_fd, size_t page_cnt,
 {
        struct perf_buffer_params p = {};
 
-       if (page_cnt == 0 || !attr)
+       if (!attr)
                return libbpf_err_ptr(-EINVAL);
 
        if (!OPTS_VALID(opts, perf_buffer_raw_opts))
@@ -10992,7 +10992,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt,
        __u32 map_info_len;
        int err, i, j, n;
 
-       if (page_cnt & (page_cnt - 1)) {
+       if (page_cnt == 0 || (page_cnt & (page_cnt - 1))) {
                pr_warn("page count should be power of two, but is %zu\n",
                        page_cnt);
                return ERR_PTR(-EINVAL);