From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752126AbdC0GZq (ORCPT ); Mon, 27 Mar 2017 02:25:46 -0400 Received: from mga07.intel.com ([134.134.136.100]:20142 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752044AbdC0GZo (ORCPT ); Mon, 27 Mar 2017 02:25:44 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,229,1486454400"; d="scan'208";a="1147304412" From: changbin.du@intel.com To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org Cc: linux-kernel@vger.kernel.org, Changbin Du Subject: [PATCH v2] perf: fix double free at function perf_hpp__reset_output_field Date: Mon, 27 Mar 2017 14:22:55 +0800 Message-Id: <20170327062255.27309-1-changbin.du@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20170315021631.31980-1-changbin.du@intel.com> References: <20170315021631.31980-1-changbin.du@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Changbin Du Some perf_hpp_fmt both registered at field and sort list. For such instance, we only can free it when removed from the both lists. This function currently only used by self-test code, but still should fix it. Signed-off-by: Changbin Du --- v2: removed redundant Signed-off. --- tools/perf/ui/hist.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index 5d632dc..f94b301 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c @@ -609,20 +609,25 @@ static void fmt_free(struct perf_hpp_fmt *fmt) void perf_hpp__reset_output_field(struct perf_hpp_list *list) { - struct perf_hpp_fmt *fmt, *tmp; + struct perf_hpp_fmt *field_fmt, *sort_fmt, *tmp1, *tmp2; /* reset output fields */ - perf_hpp_list__for_each_format_safe(list, fmt, tmp) { - list_del_init(&fmt->list); - list_del_init(&fmt->sort_list); - fmt_free(fmt); + perf_hpp_list__for_each_format_safe(list, field_fmt, tmp1) { + list_del_init(&field_fmt->list); + /* reset sort keys */ + perf_hpp_list__for_each_sort_list_safe(list, sort_fmt, tmp2) { + if (field_fmt == sort_fmt) { + list_del_init(&field_fmt->sort_list); + break; + } + } + fmt_free(field_fmt); } - /* reset sort keys */ - perf_hpp_list__for_each_sort_list_safe(list, fmt, tmp) { - list_del_init(&fmt->list); - list_del_init(&fmt->sort_list); - fmt_free(fmt); + /* reset remaining sort keys */ + perf_hpp_list__for_each_sort_list_safe(list, sort_fmt, tmp1) { + list_del_init(&sort_fmt->sort_list); + fmt_free(sort_fmt); } } -- 2.7.4