From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DEC81C282C4 for ; Tue, 5 Feb 2019 00:21:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A018F20821 for ; Tue, 5 Feb 2019 00:21:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="UAqMp8Ck" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726946AbfBEAVA (ORCPT ); Mon, 4 Feb 2019 19:21:00 -0500 Received: from mail-vs1-f73.google.com ([209.85.217.73]:51712 "EHLO mail-vs1-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725874AbfBEAVA (ORCPT ); Mon, 4 Feb 2019 19:21:00 -0500 Received: by mail-vs1-f73.google.com with SMTP id p1so649872vsc.18 for ; Mon, 04 Feb 2019 16:20:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=t1Mzyeypm6+l5w02lyoLxBBvK875TCGnFh7oJ7PaXPw=; b=UAqMp8CkfJPz6Y6d0pXXBWLQuuExcmI3SaV7Ebbi/g8vSkKFW9a1WRpW91uL3XIp2A zgGwwj+gXi54Fe9O0HydnbCENYu+O9G8nOquCH3r7hGyz+K+KDVy9ZdKxNBqMewEYYIJ UoLKTqwqyDnwmSegUqs1qrZgahq7XGuW55I/n+deIxj99vfe1b8Si6qvVgfPDu7X77qz KY8vZ+w9zpZ4Jd4M9/s+Ip1NlgLrUBJXE01BiwPU+izwAcx+AIdJt0EpDFdWLTrNHahh dLsbrHVN9iUalNBYRqtFgNR/Utjv4AMs/iQX6EMV3YXH6hyeksxQTtf5Mch+yJ06jqm7 +MJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=t1Mzyeypm6+l5w02lyoLxBBvK875TCGnFh7oJ7PaXPw=; b=k+5J6pqOsJGIHlMpO1IhTGqUjaYl1lUTz9UMrJSZkZKNSxUBsPqRPXw8ezWsjrh3c6 3aBo81GDbqSGNh/nMLXHO1Dzfq7TvDQeNJrvt2A5Hq/7mrw94VdZftUIXWlML21QLItQ GW9CYgD5mNpXuLekszOgcz2qutbtUJt0v80yISnWq518j5aj+rJ6V9Jaw6AwBI8XEamh +HIvhhjMth1dMqgUfF9aLlWvSLzDIwpHMpFGsFXlhXOPJb0uFAo9i7cq2Cv448Y2lmVG BxfKFZfCDjseuIQiQvviBK65DTy2jBiYls9h50yMMgnmUuZZ5DUHIGUjGK5cAGH34QCV d2dg== X-Gm-Message-State: AHQUAuaeRfsFQ8yVvdXwuHlPSJxdLKwqli+1ufMzZZr0ajzhuwuVlW3I 46CkFy9+mvpcKDxTAWEoUiIw5Mi/7ePwYB+BzNBtkZh+8TkjoczZNzVtugz9WUvNFu4/D4F+738 unfploTq4aYchESknAZxeMe9mgdQQmm4Qbtbv5EtDpvi/5OXX+LUPhg== X-Google-Smtp-Source: AHgI3Ib10on2UGCILUJ/tdq/QhoK/c+VH2As4/pscI9vXVV7FG/rLI7PIiEwbgNVBqpFjM+B1G4d/fg= X-Received: by 2002:a1f:91d4:: with SMTP id t203mr1453808vkd.2.1549326058669; Mon, 04 Feb 2019 16:20:58 -0800 (PST) Date: Mon, 4 Feb 2019 16:20:55 -0800 Message-Id: <20190205002055.80759-1-sdf@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.20.1.611.gfbb209baf1-goog Subject: [PATCH bpf-next] libbpf: fix libbpf_print From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: yhs@fb.com, davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, Stanislav Fomichev Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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 --- tools/lib/bpf/libbpf.c | 14 ++++---------- tools/lib/bpf/libbpf.h | 3 +-- tools/perf/util/bpf-loader.c | 10 ++-------- tools/testing/selftests/bpf/test_btf.c | 13 ++----------- tools/testing/selftests/bpf/test_libbpf_open.c | 10 ++-------- tools/testing/selftests/bpf/test_progs.c | 10 ++-------- 6 files changed, 13 insertions(+), 47 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 84ca6c2bea91..47969aa0faf8 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/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/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 19dbc1bed960..69a7c25eaccc 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/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); diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index 38afdbe6a9e0..037d8ff6a634 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c @@ -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 { diff --git a/tools/testing/selftests/bpf/test_btf.c b/tools/testing/selftests/bpf/test_btf.c index aebaeff5a5a0..5afab823ffbe 100644 --- a/tools/testing/selftests/bpf/test_btf.c +++ b/tools/testing/selftests/bpf/test_btf.c @@ -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) \ diff --git a/tools/testing/selftests/bpf/test_libbpf_open.c b/tools/testing/selftests/bpf/test_libbpf_open.c index b9ff3bf76544..1909ecf4d999 100644 --- a/tools/testing/selftests/bpf/test_libbpf_open.c +++ b/tools/testing/selftests/bpf/test_libbpf_open.c @@ -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 diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 55d05102e7bf..c52bd90fbb34 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -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() -- 2.20.1.611.gfbb209baf1-goog