Received: by 10.213.65.68 with SMTP id h4csp845578imn; Tue, 27 Mar 2018 09:51:50 -0700 (PDT) X-Google-Smtp-Source: AIpwx49fgmtLzlgS07lqx5Jrow7sqnUsAGzi7HyFAFJEdDA6bDhlnskPZZ5+j/0BfXBUVFPbBnNz X-Received: by 2002:a17:902:a60d:: with SMTP id u13-v6mr65046plq.305.1522169510379; Tue, 27 Mar 2018 09:51:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522169510; cv=none; d=google.com; s=arc-20160816; b=LxNth5Qgfw886qZGd6CWMDISI4wBsT57lNPmMdPDH6XDkAItUx7ZcHTh/YF7JOOPS5 kR3M72Lt7z+BiFO3tWbZLG8P0JeNuj3/iF7471dhDgwtBYjS+gVddb4R8NfqzEh8R5HI 5hs8cOeBn8QtgBMlTIaMiGnsakjUttCna2UvWrW3dgysUkPbPa7ViquxxiN91rxFIt/l Hq9xrn5FmOmTczeKZkPAdpcA7B45kK7QBHpmJYjoGgCXJ1+OZkCW7Dhf6hVXu2s/+5ZP 2MUKfMqmEQB0eod1yO4046kOM5AvmVqD6jFEy9ORGvE03e6cg+bU/BLvwNW8tu0t+Ig3 cJtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=uzNDd4jR2u4aR2gvvgrWkgGaA3u8xKMxukprg/5hOrE=; b=NZxqrLyFEuWvicJ1HOw58TjbWI0fDnqv9Kuumkot8FS7xDFnMAaDtuV5DemN4S3D1q VQRR14EqhZZAFfO1dyJlNrLbjBt+ZA8eA0J3OdMA1KdSr+P35iAGqxd9guxUFJDkCZm+ 9wOsWwaCqtXp80/pnyohgGKzjwyA3UepLqMzugYpZ6+GQfT1VVbS+ZMeD16unHU3+euK OgPJWOtFrfpB9B7bGWMUaquD6zmgEmJzIZ6SJ95elT/TsgN664K7AEEv9vsOw6rXYKpB +rYXR/sOTaxIGbQrCgA47xjkjFnTElKJEwIiX37T7WUEXhg1R/eDzxXo2NQ9miYU6AtC LPHw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t10-v6si1643284plh.231.2018.03.27.09.51.35; Tue, 27 Mar 2018 09:51:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753071AbeC0QuB (ORCPT + 99 others); Tue, 27 Mar 2018 12:50:01 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:49292 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932831AbeC0Qmv (ORCPT ); Tue, 27 Mar 2018 12:42:51 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 7C1C010C4; Tue, 27 Mar 2018 16:42:50 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexei Starovoitov , Yonghong Song , Daniel Borkmann Subject: [PATCH 4.15 096/105] trace/bpf: remove helper bpf_perf_prog_read_value from tracepoint type programs Date: Tue, 27 Mar 2018 18:28:16 +0200 Message-Id: <20180327162803.916571825@linuxfoundation.org> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180327162757.813009222@linuxfoundation.org> References: <20180327162757.813009222@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: Yonghong Song commit f005afede992e265bb98534b86912bb669ccd0d2 upstream. Commit 4bebdc7a85aa ("bpf: add helper bpf_perf_prog_read_value") added helper bpf_perf_prog_read_value so that perf_event type program can read event counter and enabled/running time. This commit, however, introduced a bug which allows this helper for tracepoint type programs. This is incorrect as bpf_perf_prog_read_value needs to access perf_event through its bpf_perf_event_data_kern type context, which is not available for tracepoint type program. This patch fixed the issue by separating bpf_func_proto between tracepoint and perf_event type programs and removed bpf_perf_prog_read_value from tracepoint func prototype. Fixes: 4bebdc7a85aa ("bpf: add helper bpf_perf_prog_read_value") Reported-by: Alexei Starovoitov Signed-off-by: Yonghong Song Signed-off-by: Daniel Borkmann Signed-off-by: Greg Kroah-Hartman --- kernel/trace/bpf_trace.c | 68 +++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 28 deletions(-) --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -636,7 +636,41 @@ static const struct bpf_func_proto bpf_g .arg3_type = ARG_ANYTHING, }; -BPF_CALL_3(bpf_perf_prog_read_value_tp, struct bpf_perf_event_data_kern *, ctx, +static const struct bpf_func_proto *tp_prog_func_proto(enum bpf_func_id func_id) +{ + switch (func_id) { + case BPF_FUNC_perf_event_output: + return &bpf_perf_event_output_proto_tp; + case BPF_FUNC_get_stackid: + return &bpf_get_stackid_proto_tp; + default: + return tracing_func_proto(func_id); + } +} + +static bool tp_prog_is_valid_access(int off, int size, enum bpf_access_type type, + struct bpf_insn_access_aux *info) +{ + if (off < sizeof(void *) || off >= PERF_MAX_TRACE_SIZE) + return false; + if (type != BPF_READ) + return false; + if (off % size != 0) + return false; + + BUILD_BUG_ON(PERF_MAX_TRACE_SIZE % sizeof(__u64)); + return true; +} + +const struct bpf_verifier_ops tracepoint_verifier_ops = { + .get_func_proto = tp_prog_func_proto, + .is_valid_access = tp_prog_is_valid_access, +}; + +const struct bpf_prog_ops tracepoint_prog_ops = { +}; + +BPF_CALL_3(bpf_perf_prog_read_value, struct bpf_perf_event_data_kern *, ctx, struct bpf_perf_event_value *, buf, u32, size) { int err = -EINVAL; @@ -653,8 +687,8 @@ clear: return err; } -static const struct bpf_func_proto bpf_perf_prog_read_value_proto_tp = { - .func = bpf_perf_prog_read_value_tp, +static const struct bpf_func_proto bpf_perf_prog_read_value_proto = { + .func = bpf_perf_prog_read_value, .gpl_only = true, .ret_type = RET_INTEGER, .arg1_type = ARG_PTR_TO_CTX, @@ -662,7 +696,7 @@ static const struct bpf_func_proto bpf_p .arg3_type = ARG_CONST_SIZE, }; -static const struct bpf_func_proto *tp_prog_func_proto(enum bpf_func_id func_id) +static const struct bpf_func_proto *pe_prog_func_proto(enum bpf_func_id func_id) { switch (func_id) { case BPF_FUNC_perf_event_output: @@ -670,34 +704,12 @@ static const struct bpf_func_proto *tp_p case BPF_FUNC_get_stackid: return &bpf_get_stackid_proto_tp; case BPF_FUNC_perf_prog_read_value: - return &bpf_perf_prog_read_value_proto_tp; + return &bpf_perf_prog_read_value_proto; default: return tracing_func_proto(func_id); } } -static bool tp_prog_is_valid_access(int off, int size, enum bpf_access_type type, - struct bpf_insn_access_aux *info) -{ - if (off < sizeof(void *) || off >= PERF_MAX_TRACE_SIZE) - return false; - if (type != BPF_READ) - return false; - if (off % size != 0) - return false; - - BUILD_BUG_ON(PERF_MAX_TRACE_SIZE % sizeof(__u64)); - return true; -} - -const struct bpf_verifier_ops tracepoint_verifier_ops = { - .get_func_proto = tp_prog_func_proto, - .is_valid_access = tp_prog_is_valid_access, -}; - -const struct bpf_prog_ops tracepoint_prog_ops = { -}; - static bool pe_prog_is_valid_access(int off, int size, enum bpf_access_type type, struct bpf_insn_access_aux *info) { @@ -754,7 +766,7 @@ static u32 pe_prog_convert_ctx_access(en } const struct bpf_verifier_ops perf_event_verifier_ops = { - .get_func_proto = tp_prog_func_proto, + .get_func_proto = pe_prog_func_proto, .is_valid_access = pe_prog_is_valid_access, .convert_ctx_access = pe_prog_convert_ctx_access, };