Skip to content

Commit

Permalink
libbpf: fix libbpf_print
Browse files Browse the repository at this point in the history
With the recent print rework we now have the following problem:
pr_{warning,info,debug} expand to __pr which calls libbpf_print.
libbpf_print does va_start and calls __libbpf_pr with va_list argument.
In __base_pr we again do va_start. Because the next argument is a
va_list, we don't get correct pointer to the argument (and print noting
in my case, I don't know why it doesn't crash tbh).

Fix this by changing libbpf_print_fn_t signature to accept va_list and
remove unneeded calls to va_start in the existing users.

Alternatively, this can we solved by exporting __libbpf_pr and
changing __pr macro to (and killing libbpf_print):
{
	if (__libbpf_pr)
		__libbpf_pr(level, "libbpf: " fmt, ##__VA_ARGS__)
}

Signed-off-by: Stanislav Fomichev <sdf@google.com>
Acked-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
  • Loading branch information
Stanislav Fomichev authored and Alexei Starovoitov committed Feb 5, 2019
1 parent 1728b11 commit a8a1f7d
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 47 deletions.
14 changes: 4 additions & 10 deletions tools/lib/bpf/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,22 +54,16 @@

#define __printf(a, b) __attribute__((format(printf, a, b)))

__printf(2, 3)
static int __base_pr(enum libbpf_print_level level, const char *format, ...)
static int __base_pr(enum libbpf_print_level level, const char *format,
va_list args)
{
va_list args;
int err;

if (level == LIBBPF_DEBUG)
return 0;

va_start(args, format);
err = vfprintf(stderr, format, args);
va_end(args);
return err;
return vfprintf(stderr, format, args);
}

static __printf(2, 3) libbpf_print_fn_t __libbpf_pr = __base_pr;
static libbpf_print_fn_t __libbpf_pr = __base_pr;

void libbpf_set_print(libbpf_print_fn_t fn)
{
Expand Down
3 changes: 1 addition & 2 deletions tools/lib/bpf/libbpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ enum libbpf_print_level {
};

typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level,
const char *, ...)
__attribute__((format(printf, 2, 3)));
const char *, va_list ap);

LIBBPF_API void libbpf_set_print(libbpf_print_fn_t fn);

Expand Down
10 changes: 2 additions & 8 deletions tools/perf/util/bpf-loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,9 @@
#include "c++/clang-c.h"

static int libbpf_perf_print(enum libbpf_print_level level __attribute__((unused)),
const char *fmt, ...)
const char *fmt, va_list args)
{
va_list args;
int ret;

va_start(args, fmt);
ret = veprintf(1, verbose, pr_fmt(fmt), args);
va_end(args);
return ret;
return veprintf(1, verbose, pr_fmt(fmt), args);
}

struct bpf_prog_priv {
Expand Down
13 changes: 2 additions & 11 deletions tools/testing/selftests/bpf/test_btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,10 @@ static int count_result(int err)
return err;
}

#define __printf(a, b) __attribute__((format(printf, a, b)))

__printf(2, 3)
static int __base_pr(enum libbpf_print_level level __attribute__((unused)),
const char *format, ...)
const char *format, va_list args)
{
va_list args;
int err;

va_start(args, format);
err = vfprintf(stderr, format, args);
va_end(args);
return err;
return vfprintf(stderr, format, args);
}

#define BTF_INFO_ENC(kind, kind_flag, vlen) \
Expand Down
10 changes: 2 additions & 8 deletions tools/testing/selftests/bpf/test_libbpf_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,13 @@ static void usage(char *argv[])

static bool debug = 0;
static int libbpf_debug_print(enum libbpf_print_level level,
const char *fmt, ...)
const char *fmt, va_list args)
{
va_list args;
int ret;

if (level == LIBBPF_DEBUG && !debug)
return 0;

va_start(args, fmt);
fprintf(stderr, "[%d] ", level);
ret = vfprintf(stderr, fmt, args);
va_end(args);
return ret;
return vfprintf(stderr, fmt, args);
}

#define EXIT_FAIL_LIBBPF EXIT_FAILURE
Expand Down
10 changes: 2 additions & 8 deletions tools/testing/selftests/bpf/test_progs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1785,18 +1785,12 @@ static void test_task_fd_query_tp(void)
}

static int libbpf_debug_print(enum libbpf_print_level level,
const char *format, ...)
const char *format, va_list args)
{
va_list args;
int ret;

if (level == LIBBPF_DEBUG)
return 0;

va_start(args, format);
ret = vfprintf(stderr, format, args);
va_end(args);
return ret;
return vfprintf(stderr, format, args);
}

static void test_reference_tracking()
Expand Down

0 comments on commit a8a1f7d

Please sign in to comment.