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=-4.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS autolearn=no 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 B8F08C433E0 for ; Tue, 30 Jun 2020 20:07:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 865C320774 for ; Tue, 30 Jun 2020 20:07:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="c2rcBuTg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729229AbgF3UHc (ORCPT ); Tue, 30 Jun 2020 16:07:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726642AbgF3UHb (ORCPT ); Tue, 30 Jun 2020 16:07:31 -0400 Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 81A0EC061755; Tue, 30 Jun 2020 13:07:29 -0700 (PDT) Received: by mail-qk1-x741.google.com with SMTP id k18so19889925qke.4; Tue, 30 Jun 2020 13:07:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=og6sLVyAe8SkB1hiNqx+v/XAj5FzSDOWWpD1F/qTjYM=; b=c2rcBuTgmxLgRY3oT+k3oTlM9Lt832ZECTb/z5VyvJXsrhh5ghRtonASPrHdVLKsdC CqFLWUp86X42HX8XsA951E297eEQmBvUmq8UgSy4v1AnET+OiihRZG47fe4wEn1VAOLn eguW2PsB/WhdgpluBr6hYSv+CfmRw4TFCW+nzA04PDHINRgsc+oEGQb4oiXb+Uds1rxj DPnMOVV0+YIl14q2h4qfXaEBV7gBSG2RDDmvuoji3HgzYkfLvH7ehNAnzvDH1/8uYXl8 uNExwmCE7P27jd3vVkH0KigAR4jTCxjFvJ2m/cycGi1tSMDH5IJ8tppAM95LOUvgQhns Nmng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=og6sLVyAe8SkB1hiNqx+v/XAj5FzSDOWWpD1F/qTjYM=; b=gqVZ+ubAN2qcZksilFBSmC1yq+qKYiHNG0ooTL8C3soZoYl8dGUrKSPcoSk8Zlv1Sv ZcWP3debUKHKDHg3dccYApGVPSbqerEFzoUQvWbQUQc9C2ed6a9blMhsC9fWQCOQgo1s 8mOkvRz8EOVTo9WtqA9kHR+RPrr4t5P1bQavwUtKTScoJCu1J9gXXTbkz3JW4h8K9C+B gdVnvytWAfq+2XQE12ljdheSR734MN+4izgywxtFLZJ4CmcmPmH3tkOiv5qyhRzQqlzj 5IJot56JabDyukNGp8yMdHsvhlzRqhPCkOUXWPskHIEzQdA/brEqNfbdKmD3Nyzvi4fs xcDA== X-Gm-Message-State: AOAM531w7vz47LopIUhMj5gsGZhpHPTI0soA6UyS+npegQjgFoNWHdAF ksRFVFOY1hxbdP72Q1/quhW64dEj6/SWfpC/VIU= X-Google-Smtp-Source: ABdhPJwHKbtFRjdEH7yiBiIYkOIM1d4Vp0HgBxaTBPzk3RUzU0FGB7K+wvVItTyJ5AJaYZL3njInZX/yX2T29PECdO4= X-Received: by 2002:a37:7683:: with SMTP id r125mr19275856qkc.39.1593547648700; Tue, 30 Jun 2020 13:07:28 -0700 (PDT) MIME-Version: 1.0 References: <20200625221304.2817194-1-jolsa@kernel.org> <20200625221304.2817194-8-jolsa@kernel.org> In-Reply-To: From: Andrii Nakryiko Date: Tue, 30 Jun 2020 13:07:17 -0700 Message-ID: Subject: Re: [PATCH v4 bpf-next 07/14] bpf: Allow nested BTF object to be refferenced by BTF object + offset To: Jiri Olsa Cc: Alexei Starovoitov , Daniel Borkmann , Networking , bpf , Song Liu , Yonghong Song , Martin KaFai Lau , David Miller , John Fastabend , Wenbo Zhang , KP Singh , Andrii Nakryiko , Brendan Gregg , Florent Revest , Al Viro Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, Jun 30, 2020 at 1:05 PM Andrii Nakryiko wrote: > > On Thu, Jun 25, 2020 at 4:49 PM Jiri Olsa wrote: > > > > Adding btf_struct_address function that takes 2 BTF objects > > and offset as arguments and checks whether object A is nested > > in object B on given offset. > > > > This function will be used when checking the helper function > > PTR_TO_BTF_ID arguments. If the argument has an offset value, > > the btf_struct_address will check if the final address is > > the expected BTF ID. > > > > This way we can access nested BTF objects under PTR_TO_BTF_ID > > pointer type and pass them to helpers, while they still point > > to valid kernel BTF objects. > > > > Using btf_struct_access to implement new btf_struct_address > > function, because it already walks down the given BTF object. > > > > Signed-off-by: Jiri Olsa > > --- > > include/linux/bpf.h | 3 ++ > > kernel/bpf/btf.c | 67 ++++++++++++++++++++++++++++++++++++++----- > > kernel/bpf/verifier.c | 37 +++++++++++++++--------- > > 3 files changed, 87 insertions(+), 20 deletions(-) > > [...] > > > > error: > > bpf_log(log, "access beyond struct %s at off %u size %u\n", > > @@ -4043,9 +4054,21 @@ int btf_struct_access(struct bpf_verifier_log *log, > > > > /* adjust offset we're looking for */ > > off -= moff; > > + > > + /* We are nexting into another struct, > > + * check if we are crossing expected ID. > > + */ > > + if (data->op == ACCESS_EXPECT && !off && t == data->exp_type) > > before you can do this type check, you need to btf_type_skip_modifiers() first. > Ignore this part, btf_resolve_size() (somewhat unexpectedly) already does that. > > + return 0; > > goto again; > > } > > > > + /* We are interested only in structs for expected ID, > > + * bail out. > > + */ > > + if (data->op == ACCESS_EXPECT) > > + return -EINVAL; > > + > > if (btf_type_is_ptr(mtype)) { > > const struct btf_type *stype; > > u32 id; [...]