From b19c6dcf623a7adc9e538ddbe2964c2f58dd2417 Mon Sep 17 00:00:00 2001 From: Yonghong Song Date: Mon, 4 Feb 2019 19:42:31 -0800 Subject: [PATCH] sync with bpf-next Sync with the following bug fix: commit a8a1f7d09cfc7e18874786c7634c9e71384fcd4e (HEAD -> bpf-next2, bpf-next/master) Author: Stanislav Fomichev Date: Mon Feb 4 16:20:55 2019 -0800 libbpf: fix libbpf_print 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). ...... Signed-off-by: Stanislav Fomichev Signed-off-by: Yonghong Song --- src/libbpf.c | 14 ++++---------- src/libbpf.h | 3 +-- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/libbpf.c b/src/libbpf.c index 84ca6c2..47969aa 100644 --- a/src/libbpf.c +++ b/src/libbpf.c @@ -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) { diff --git a/src/libbpf.h b/src/libbpf.h index 19dbc1b..69a7c25 100644 --- a/src/libbpf.h +++ b/src/libbpf.h @@ -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);