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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7925C433F5 for ; Sat, 6 Nov 2021 05:38:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 853F961183 for ; Sat, 6 Nov 2021 05:38:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233433AbhKFFlG (ORCPT ); Sat, 6 Nov 2021 01:41:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233122AbhKFFlF (ORCPT ); Sat, 6 Nov 2021 01:41:05 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A551C061208 for ; Fri, 5 Nov 2021 22:38:24 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id r67-20020a252b46000000b005bea12c4befso16478139ybr.19 for ; Fri, 05 Nov 2021 22:38:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=ZayAaJHcuA1bcDDOidW5iIDpwigbcsn41v2z+XbHtiI=; b=SXDPhCPtzx39uuxzIlWZELOIKZv4gyA0EQdzsEQMDIkSv+kaeZ8NuPiA9pVw/3o1zX N4554yb9P6B4XgLl4AzRwMSH3M3+DSh78fbX8hwQ4vOdJChFwJDdw1K2k0wr1MhLxxnI UwlSMTmrzlt1jSqX7PDuUiNImN5B21a+MMMtxGWrzMJ3wziLW5ehyFdi0SIi9NldHJNy dX8S0Q7jKBrO8TQJ8buTu0CQMSO6a01cPIIOPz/IpvNzQtQcV8lIi9k6lmUQ9UBsQWAh KiOK4FuGdB7m7NmXXYyqBwiaw+fCchE362eog/yOYDJiQ1wyeztT/o465v5DLZhqsVHL oQcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=ZayAaJHcuA1bcDDOidW5iIDpwigbcsn41v2z+XbHtiI=; b=C5JekoWDrBjDzMbhLWs2SjH9B8wOapephuvfEExg5WTlmhi8AHEPjP90oTDi1hw+yV oeVBWhnPXjyiqIwTXzAhCT9tS/OIb1fIkItC1axOCALf7ptaj8V+xqWng66pi34CEKT/ SVJegnFpv+ikmxsSQBMNEewJX2ag8P+8F8/kO00BTBT3X7auRSrYR95tAJyASXMW2xVj wQGg6VTJiq5BWXm1VGofY72D8jHla9eEQzgCa8YSBj9bhz3w1eG8Il5t0FWe20aazjRA JzzCDO6u+HnqDpRRuirzqfJi6ycCwogEpGugq0fuZNbIySI5Ip89YmffHcAmYg+M4VJQ U0Tg== X-Gm-Message-State: AOAM5309g7LJF0qXJloycl4vMJopqn0ECs/PL+g9TYneUDckuYjGakFg uTwyHlhgvUbArQxFzhjJBcwAElAhZP0a X-Google-Smtp-Source: ABdhPJzG9WMyFJYgNZwnoYHUb+JlLflaX6yIfrm7b3g1aUgL21oqFvCPOCOP5R/Jg7FyEJy7a49xsEAUjMTO X-Received: from irogers.svl.corp.google.com ([2620:15c:2cd:202:b70b:3e34:63e5:9e95]) (user=irogers job=sendgmr) by 2002:a25:2f13:: with SMTP id v19mr69075829ybv.410.1636177103010; Fri, 05 Nov 2021 22:38:23 -0700 (PDT) Date: Fri, 5 Nov 2021 22:37:32 -0700 Message-Id: <20211106053733.3580931-1-irogers@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog Subject: [PATCH 1/2] perf bpf: Avoid memory leak from perf_env__insert_btf From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Song Liu , linux-kernel@vger.kernel.org, Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Yonghong Song , John Fastabend , KP Singh , Tiezhu Yang , linux-perf-users@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org perf_env__insert_btf doesn't insert if a duplicate btf id is encountered and this causes a memory leak. Modify the function to return a success/error value and then free the memory if insertion didn't happen. Fixes: 3792cb2ff43b ("perf bpf: Save BTF in a rbtree in perf_env") Signed-off-by: Ian Rogers --- tools/perf/util/bpf-event.c | 5 ++++- tools/perf/util/env.c | 5 ++++- tools/perf/util/env.h | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c index 1a7112a87736..0783b464777a 100644 --- a/tools/perf/util/bpf-event.c +++ b/tools/perf/util/bpf-event.c @@ -120,7 +120,10 @@ static int perf_env__fetch_btf(struct perf_env *env, node->data_size = data_size; memcpy(node->data, data, data_size); - perf_env__insert_btf(env, node); + if (!perf_env__insert_btf(env, node)) { + /* Insertion failed because of a duplicate. */ + free(node); + } return 0; } diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index cf773f0dec38..5b24eb010336 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -74,12 +74,13 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, return node; } -void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) +bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) { struct rb_node *parent = NULL; __u32 btf_id = btf_node->id; struct btf_node *node; struct rb_node **p; + bool ret = true; down_write(&env->bpf_progs.lock); p = &env->bpf_progs.btfs.rb_node; @@ -93,6 +94,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) p = &(*p)->rb_right; } else { pr_debug("duplicated btf %u\n", btf_id); + ret = false; goto out; } } @@ -102,6 +104,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) env->bpf_progs.btfs_cnt++; out: up_write(&env->bpf_progs.lock); + return ret; } struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id) diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index 1383876f72b3..163e5ec503a2 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -167,7 +167,7 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node); struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, __u32 prog_id); -void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); +bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id); int perf_env__numa_node(struct perf_env *env, int cpu); -- 2.34.0.rc0.344.g81b53c2807-goog