From patchwork Mon Jul 31 07:31:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 128411 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:918b:0:b0:3e4:2afc:c1 with SMTP id s11csp1863871vqg; Mon, 31 Jul 2023 01:05:42 -0700 (PDT) X-Google-Smtp-Source: APBJJlE6k23VsH+QyQ/5avNOJA9swdpjPBnhjxoWUdg1C/sK3Z9GmgVJebcORCDsQrkyV0fZvE0U X-Received: by 2002:a05:6a00:996:b0:682:54b9:1093 with SMTP id u22-20020a056a00099600b0068254b91093mr13192600pfg.15.1690790741738; Mon, 31 Jul 2023 01:05:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690790741; cv=none; d=google.com; s=arc-20160816; b=NJQ5O/n+RU2O8M6wYurzn8w31+Hd0o65+ePMQjHPN0x7g5yPVeCn3N9oVKDT/n9i+G waJer8D47xeLSLeJoW2JFblCXIhENKNdnjpgL75MHxlq5ud4Z4J59tw22HQbBRdABLX2 dNeA4M0SA4srHGmI3ATablXHm2zsg3qhPhj4j58KOcXKZgsQIGG1iZnNXp9Z0p9WZeR+ 6jZUY8ChZX4thY1pfBZ2La+E+Vzx6oLRY5aSlYC9f1WLfmIwEWzFKw1Qo5WR6lGNhqxs Q43PpRG5iMoi2jcsnnwUSJx5V6mNO3HbdvcBrSVpmY661bULqTDlA+yC9z1GRKxKosRc NHng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=d5ryeJdi5jgo6b6QR68xqrEBwTu3XBH50Eh6d46WR9c=; fh=raxTTJvC+dSJYbgfX5JG5gvrVjxTZXczN0HF8iDayLY=; b=Gblb9LGbt3sOb4lITa9y7KSQSPsfcgS6lXV+7PlYhFPqbjrZpL4+XVBhf+9dGkUbHA qTtZ824UFXypkh3AzThk1fUUKLAOkwC0CvF2cQpmKF/FkZPO8XmX9BssfrZooCUItOlv Qtc7avWL0iQr4ADvt6WX6Rc2Jyy6j4PO3Y406N65rk4H5EB5ExwwzR8ipwLwCl2edN9O rfAN9k5b1ctGoVl+KsUPqI87r262dbWVNBRpCTGxHua8lOqRG6v+UID9lQ159GYI3+Lg cEMRsl+Uq8rSEAI5kROcdgIeRAw+wVCVk3URlVfUO4KpmE4aCbAfpIgbsGjeHna3mrbb 6rSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RrNR1tgQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g124-20020a636b82000000b005637e28271fsi6680848pgc.432.2023.07.31.01.05.28; Mon, 31 Jul 2023 01:05:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RrNR1tgQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231686AbjGaHc0 (ORCPT + 99 others); Mon, 31 Jul 2023 03:32:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39988 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231637AbjGaHbm (ORCPT ); Mon, 31 Jul 2023 03:31:42 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3E5B010CC; Mon, 31 Jul 2023 00:31:08 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id BEFE660F32; Mon, 31 Jul 2023 07:31:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A096C433C8; Mon, 31 Jul 2023 07:31:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690788667; bh=QCbDVf1VPNh57Ufpzf7xem7rI1/giuALEFEtHjhBjWE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RrNR1tgQgrdgasqTE6MuVSLiszRgirrlY3roSxl4LcL4xqQZaSjxnsJl3gxlDMcxN 3CqmQLrhVC73A4A398nIK5O49ocamGPUHzFv7vUsj3YaZxATgbTMQgTFFx+7nYQic7 IuR97qGalBhx/Iwwgpx8FJkGOTZ3W90Y+G/i6CISKyVYXmLJ8caqLvEpvk4GDOfyIy tEAOfuMbuJy2V3W4FgT9xUPp54QivJl5T49kw5LWY37tNZy3+9ykiIMjsORI9U7/hg FbJsfVNpYT23EliqObc/bPoKWrXvC1HMm+Db6vfdyJIz6yvZKF6Pc13oCvkoWyCVBL DlnBFTIc13DHg== From: "Masami Hiramatsu (Google)" To: linux-trace-kernel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Steven Rostedt , mhiramat@kernel.org, Martin KaFai Lau , bpf@vger.kernel.org, Sven Schnelle , Alexei Starovoitov Subject: [PATCH v4 6/9] tracing/probes: Add string type check with BTF Date: Mon, 31 Jul 2023 16:31:03 +0900 Message-Id: <169078866330.173706.18430839904581751211.stgit@devnote2> X-Mailer: git-send-email 2.34.1 In-Reply-To: <169078860386.173706.3091034523220945605.stgit@devnote2> References: <169078860386.173706.3091034523220945605.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772922592946318421 X-GMAIL-MSGID: 1772922592946318421 From: Masami Hiramatsu (Google) Add a string type checking with BTF information if possible. This will check whether the given BTF argument (and field) is signed char array or pointer to signed char. If not, it reject the 'string' type. If it is pointer to signed char, it adds a dereference opration so that it can correctly fetch the string data from memory. # echo 'f getname_flags%return retval->name:string' >> dynamic_events # echo 't sched_switch next->comm:string' >> dynamic_events The above cases, 'struct filename::name' is 'char *' and 'struct task_struct::comm' is 'char []'. But in both case, user can specify ':string' to fetch the string data. Signed-off-by: Masami Hiramatsu (Google) --- Changes in v3: - Use ctx->btf instead of traceprobe_get_btf(). --- kernel/trace/trace_probe.c | 89 +++++++++++++++++++++++++++++++++++++++++++- kernel/trace/trace_probe.h | 3 + 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index 8ce7d8f04849..46a604f786c5 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c @@ -309,6 +309,77 @@ static u32 btf_type_int(const struct btf_type *t) return *(u32 *)(t + 1); } +static bool btf_type_is_char_ptr(struct btf *btf, const struct btf_type *type) +{ + const struct btf_type *real_type; + u32 intdata; + s32 tid; + + real_type = btf_type_skip_modifiers(btf, type->type, &tid); + if (!real_type) + return false; + + if (BTF_INFO_KIND(real_type->info) != BTF_KIND_INT) + return false; + + intdata = btf_type_int(real_type); + return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED) + && BTF_INT_BITS(intdata) == 8; +} + +static bool btf_type_is_char_array(struct btf *btf, const struct btf_type *type) +{ + const struct btf_type *real_type; + const struct btf_array *array; + u32 intdata; + s32 tid; + + if (BTF_INFO_KIND(type->info) != BTF_KIND_ARRAY) + return false; + + array = (const struct btf_array *)(type + 1); + + real_type = btf_type_skip_modifiers(btf, array->type, &tid); + + intdata = btf_type_int(real_type); + return !(BTF_INT_ENCODING(intdata) & BTF_INT_SIGNED) + && BTF_INT_BITS(intdata) == 8; +} + +static int check_prepare_btf_string_fetch(char *typename, + struct fetch_insn **pcode, + struct traceprobe_parse_context *ctx) +{ + struct btf *btf = ctx->btf; + + if (!btf || !ctx->last_type) + return 0; + + /* char [] does not need any change. */ + if (btf_type_is_char_array(btf, ctx->last_type)) + return 0; + + /* char * requires dereference the pointer. */ + if (btf_type_is_char_ptr(btf, ctx->last_type)) { + struct fetch_insn *code = *pcode + 1; + + if (code->op == FETCH_OP_END) { + trace_probe_log_err(ctx->offset, TOO_MANY_OPS); + return -E2BIG; + } + if (typename[0] == 'u') + code->op = FETCH_OP_UDEREF; + else + code->op = FETCH_OP_DEREF; + code->offset = 0; + *pcode = code; + return 0; + } + /* Other types are not available for string */ + trace_probe_log_err(ctx->offset, BAD_TYPE4STR); + return -EINVAL; +} + static const char *fetch_type_from_btf_type(struct btf *btf, const struct btf_type *type, struct traceprobe_parse_context *ctx) @@ -670,6 +741,13 @@ static int parse_btf_bitfield(struct fetch_insn **pcode, #define find_fetch_type_from_btf_type(ctx) \ find_fetch_type(NULL, ctx->flags) +static int check_prepare_btf_string_fetch(char *typename, + struct fetch_insn **pcode, + struct traceprobe_parse_context *ctx) +{ + return 0; +} + #endif #define PARAM_MAX_STACK (THREAD_SIZE / sizeof(unsigned long)) @@ -1112,8 +1190,15 @@ static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size, /* Update storing type if BTF is available */ if (IS_ENABLED(CONFIG_PROBE_EVENTS_BTF_ARGS) && - !t && ctx->last_type) - parg->type = find_fetch_type_from_btf_type(ctx); + ctx->last_type) { + if (!t) { + parg->type = find_fetch_type_from_btf_type(ctx); + } else if (strstr(t, "string")) { + ret = check_prepare_btf_string_fetch(t, &code, ctx); + if (ret) + goto fail; + } + } ret = -EINVAL; /* Store operation */ diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index 9184c84833f8..7f929482e8d4 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h @@ -513,7 +513,8 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call, C(NOSUP_DAT_ARG, "Non pointer structure/union argument is not supported."),\ C(BAD_HYPHEN, "Failed to parse single hyphen. Forgot '>'?"), \ C(NO_BTF_FIELD, "This field is not found."), \ - C(BAD_BTF_TID, "Failed to get BTF type info."), + C(BAD_BTF_TID, "Failed to get BTF type info."),\ + C(BAD_TYPE4STR, "This type does not fit for string."), #undef C #define C(a, b) TP_ERR_##a