From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DB46364043 for ; Thu, 23 Jul 2026 04:59:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782801; cv=none; b=imWiQetvyL5fHzAb3r+KV6aDMNlZEpQFdxOoi1/qach9l6RlCirO2QpV91XQxdrEZblb1SXjYDlpH5m7ej2FqDNI0d4mLlw+NMnrxXvQYfsDft31ms7NBwcr8TU6oEB9WEXb2lLKezl623c9yd7gFOTFdJuTQrcQP6iGabfsBSg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782801; c=relaxed/simple; bh=pID4/alJYNG0QOaOzBgne03+sPbT/nEX+vME0pae7N8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nvgueowqz0nVaQjhFy3LzfTKxOguDLurns2HIzVTn/F+ZjgTysrbs4umYim0lE7BOcH5IhYab4+qY/QUvDQPYngCr7R3kzz1J2DN/DxRFehe2Yh/dVrix6KDTqI1mVkq91bonAr5wYd/975VfqxhizF4Hl9KOVu3NSS06Gf8/5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=s6rZlfaI; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="s6rZlfaI" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-3811279d51aso505365a91.1 for ; Wed, 22 Jul 2026 21:59:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782796; x=1785387596; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=5Ve2zmIa6pxnua96cTXgBtsg/co1g9aZD4YRJ0W7aCc=; b=s6rZlfaIyl68jcxGMqbfMq+9A7kPk9Vd2d75F1BdbrveLhTVRnpPdz4oTn9TXQp7n9 yIBj7yhhH8/o9nknakPqL+AZHNNYFlrbGtqy+M5Fm9O68icYiDMx7a4BvyWK95Nbk4Vk mSaW1s/gbyyYdLXDMzdn6+JZ/qDId+DI8k5we39fvVZM+acw+O/6xhEWLY0s6g+NG27W +jJ1+zO1f94lRoRGhue+qCDkM3bM4YREsxjv/GiQ4ZTsj7AgrFkVlsuGbG1+pywEZnyV CRrtIDO8Tr0D14zTUnpclHs32cfJsSm+uIFMzf3iPuQZ2rmymJx/wPmnrNUAIO9XHxIX Terg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782796; x=1785387596; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=5Ve2zmIa6pxnua96cTXgBtsg/co1g9aZD4YRJ0W7aCc=; b=sbNfiCNvi3jGX3j6IZ5KTVInvUO1BFIVq7IAYSwKlFSsOH/ZwARdLZ1f2+irug6seU esgcLKn+9yRIWYNRNowTd/gHQSvoGglLVPSD+E7SigRu6a/6umE3crQfSY/nqqDEJkRt gR1c7N6j/TTb2aIPtrhFbNoFw5CjjMB2336rnIhY6nf6FjzqyBaJSglGE7/bRxnzXUIs 2OylqLmwFnLADscvCDhL+o7eHb9pegC2MmW3n1uYJ2LUU4cRyMJhu5ojp5JxeGdhMy3H LNfWtjNJl/Y3MzCEv89nP6AyE5kCHWop1fJrpNUCQRAlvVeZi6+EJ3ZiLDGFLC5dhlpw Nb5Q== X-Forwarded-Encrypted: i=1; AHgh+RrEPD5PWQZB+hm91krA+lJLMf+KGX9yrR22YmpAHJuY5ycp0FmVF5e7ugHbGR2Mm6HSGTQqNz00VtBZAP0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1AiXCPuZEIIDQgncJSKGh5rnVUokaayO/Xg6WWAhaKS6ZMORw 2H03b8USBqH8Gcg6wavKuOqf5TAzCNFeX/61k2yGqVb9+NT/fRsadHhO5W9YzofYwKDscGjo2e/ Fq7k8GYEcZA== X-Received: from dlbut13.prod.google.com ([2002:a05:7022:7e0d:b0:13b:8034:c3ce]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:134d:b0:38e:bbf1:de34 with SMTP id 98e67ed59e1d1-38ec653883bmr1691770a91.7.1784782796226; Wed, 22 Jul 2026 21:59:56 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:44 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-2-irogers@google.com> Subject: [PATCH v7 1/6] perf ui hists: Fix stack use-after-return in symbol_filter_str From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In evsel__hists_browse(), the local stack array 'buf' is assigned directly to the persistent 'hists->symbol_filter_str' pointer. When the browser returns or is exited, this dangling pointer remains active in the 'hists' struct and is read asynchronously by the perf top background timer, triggering a stack use-after-return. Fix it by properly duplicating the input string using strdup(), safely invoking zfree() to prevent memory leaks when overwriting, and cleanly resetting and freeing the symbol filter string upon exiting the browser. Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers --- tools/perf/builtin-report.c | 7 +++++-- tools/perf/ui/browsers/hists.c | 5 ++++- tools/perf/util/hist.c | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 10db1e5f1e6c..60d1f166629e 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -726,8 +726,11 @@ static int report__collapse_hists(struct report *rep) evlist__for_each_entry(rep->session->evlist, pos) { struct hists *hists =3D evsel__hists(pos); =20 - if (pos->core.idx =3D=3D 0) - hists->symbol_filter_str =3D rep->symbol_filter_str; + if (pos->core.idx =3D=3D 0) { + hists->symbol_filter_str =3D + rep->symbol_filter_str ? + strdup(rep->symbol_filter_str) : NULL; + } =20 hists->socket_filter =3D rep->socket_filter; =20 diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index b6002724bc3a..be8a6b169722 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -3220,7 +3220,10 @@ static int evsel__hists_browse(struct evsel *evsel, = int nr_events, const char *h "To remove the filter later, press / + ENTER.", buf, "ENTER: OK, ESC: Cancel", delay_secs * 2) =3D=3D K_ENTER) { - hists->symbol_filter_str =3D *buf ? buf : NULL; + char *new_filter =3D *buf ? strdup(buf) : NULL; + + zfree(&hists->symbol_filter_str); + hists->symbol_filter_str =3D new_filter; hists__filter_by_symbol(hists); hist_browser__reset(browser); } diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index c93915625ee7..443694926f1a 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -3056,6 +3056,7 @@ static void hists_evsel__exit(struct evsel *evsel) struct perf_hpp_list_node *node, *tmp; =20 hists__delete_all_entries(hists); + zfree(&hists->symbol_filter_str); zfree(&hists->mem_stat_types); zfree(&hists->mem_stat_total); =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C84D5383312 for ; Thu, 23 Jul 2026 05:00:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782805; cv=none; b=qJZMy24WNE7gmZW1pr1pytnVnnUqeebb06qMROa8ii/sRigceonoE0ScKwNBuBt6Tar0uxDVV/84tXynF6XtCLjuKlmq3kxp5yHCIeTbwBA9U4VdLRLhHjwuqZSWSiWsxyP/bJPxn8L1NQ1ZgIaCrf5ABmY1szfkaG2UIbNoTgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782805; c=relaxed/simple; bh=bEnNECJvHXimmsTecSP4yaSIJ0gxccx93jr0yIJvCVI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TIxlmYPo84mkDMCERJVw2iZtl2l5xNQytacQN7MetXjILli6gpATtGoIdYXlSbKtG4L82lIt5F2JMztEr/71Oz9FG285UsswGfwNt77BxrUOI4Yv6WVIdsZm7o1YbzeMWYHx29walpdDYfedNf2/pHlaA6UcZdwTennLHZWJ1K0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=uqe0IYNy; arc=none smtp.client-ip=209.85.216.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="uqe0IYNy" Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38e1118e4abso475249a91.0 for ; Wed, 22 Jul 2026 22:00:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782798; x=1785387598; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=asfkKKPPdKeo5C2ctXLmi7D2DfJoKiaFqe1LNGAidu0=; b=uqe0IYNyQCHR/MeMlVn5DuQjzp0pOEbz6UQb4UIhDXNPitsTIJGFsO+VUDjI4TuTV1 cMHn7vtMckcKYL1N/wuozIaH2vyhnK8LLZA+EZRuiGtdHrgyw+Mm7XC2I/Ywep6/O2f4 L25Pb2tHJeG6A15U7un1gJ2aSK516HceJqOmAvPHP/YwmrLbjAMs7rjMz0wn90SzFY2f mxG5M6CZBCdidvwZlrBzwsUTgHeIB8Eyb7ANzWRYSxjz32y9WLMcjBwoHs31d5Xa2aW0 fHCLjY3RGkC2FYQXbwJWu52a4fXZR8xqJ8NgFUJDZ7ZUUUekkDCSbiyc9GBmwvcLG+Td uhvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782798; x=1785387598; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=asfkKKPPdKeo5C2ctXLmi7D2DfJoKiaFqe1LNGAidu0=; b=KhzIo3Xh1wl2ycwk5pM8lDzFhOvI9oKlWNO29h+fQyW4rXR2TtwQjRqiETsLnMJ7M5 GKryJ//NLvdDXYzVyhARZllYZeNIOGIws2zodROoTeudp31QOeJivYJiZeCC8rYObZyX W6fzjcZ9vyr+A3qCW4YF8y2m/SXtI1jRsygF+IRUnE12MiMyx816ab/BOXFUpO0UEBns 5Eha/u/esZfEgtAbGetJ6aJ3ePsjG92OjQnLiN6zd29q9SnobtsiCqNVluwaqDy/v8/P jlAam0TK0myB2RcSdci50XtJqmdEnCxKdZwbdpgJCO7EXzh3xqlbpkXlCwaMcpTYJEbr 2fgA== X-Forwarded-Encrypted: i=1; AHgh+RoY6qRsSqezHlTUAda7uxadSbNNHHxz9vAjP4mo8ti23cLNsCFJxQNIMmVYwv42pH9KwyOsehgqCs678mU=@vger.kernel.org X-Gm-Message-State: AOJu0YyHPDE7713AtzMmOzilQFCTcLE0EKCuLF8KEmBlktZyIKbDFzdL vXXsVdLJTUsKhxMOEjm5/aXE4E8oxOjPiukLwTevDMtLqclcHA3Tuvbx8Fv6+/p90G/Ae1DQLMg 13MKSuOzG+A== X-Received: from dlbtu15.prod.google.com ([2002:a05:7022:3c0f:b0:13d:1bd0:e6cd]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d44:b0:38d:dfd1:7a8 with SMTP id 98e67ed59e1d1-38ec63e1ed7mr1593723a91.2.1784782797906; Wed, 22 Jul 2026 21:59:57 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:45 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-3-irogers@google.com> Subject: [PATCH v7 2/6] perf ui hists: Guard against NULL hist_entry in add_script_opt() From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In add_script_opt(), when the browser selection has no valid hist_entry (for example, when all entries are filtered out or the trace is empty), hist_browser__selected_entry() returns NULL. Add an explicit check for he =3D=3D NULL prior to accessing he->time to avo= id a potential NULL pointer dereference crash. Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers --- tools/perf/ui/browsers/hists.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index be8a6b169722..f5e13fc125c6 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -2826,6 +2826,8 @@ add_script_opt(struct hist_browser *browser, time_optstr++; time_act++; } + if (he =3D=3D NULL) + return n; j =3D sprintf(tstr, " in "); j +=3D timestamp__scnprintf_usec(he->time, tstr + j, sizeof tstr - j); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D9363911C1 for ; Thu, 23 Jul 2026 05:00:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782806; cv=none; b=WVe6do6mA1hzelcebuwTI9hPZkobhkVFQr86NxuI3voM9OxAhHWyns8GwkE7VbD7fHduMNhtNwhM2EqhSjPpkkmp8y98kEJpAAuPUdJ2nsFOirFFDV3ZptA828YpUdL0+Uj96oBu/cpaBuhY0xAl93ygZ2zQ7WBcXSHWh7yyZ2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782806; c=relaxed/simple; bh=kh31A68W6fp1QIuEyOVeIzYBsOxWc/ieYSLlFZuHODA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=pPbjwYUghlDnQCCc04BheqfEzksdP9Z8Rm/1CvGw1wL/MKfkRt/5kHOi7WypiTB2K5I0ADXb1fF8VDbukziK8+/3fBJ8dO9f8+TKJMh1qJXy9PDsQNsx5XKTQM4GXswzNFvOaau0s6v6GNWKjVe6h5aFsb29nHUf8tAQG34U0+s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LOlQpZV3; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LOlQpZV3" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cf6acd760cso4475085ad.3 for ; Wed, 22 Jul 2026 22:00:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782800; x=1785387600; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=hoVRrd065X4nNSzDa7DxgDBAhVFsnDoscw8jyLzmHP4=; b=LOlQpZV3CrHqsneX3U7nAATjCl8L6P+vHj1Js6gCtoX0j45ITEx50SeWiJXanqGLK0 D4j80p3TpnTgS7eF1L9tNZDR0bDF5GGllx+0NWHGiZsFgDbs/+YuLgfFT+aSUAo+TZvQ IF1BVXqSfWysJ77PZfRAZcsh3A/lRPGDE1wiY3ggu6trmpRRDeysAW+D7dSO1qwYgKPh skZHHYnXZl9DAiJYxge9S2jJt/qnUicmTuyICsi0GWRq6Ieq66V95l+144HgIu13zagC MFHGJMeXdKIxKQZAw+nwC+EYx2vBcd+jSpuTIl7oLQyOKhBs1JLOc9mm5Q/LmIavEZnd szag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782800; x=1785387600; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=hoVRrd065X4nNSzDa7DxgDBAhVFsnDoscw8jyLzmHP4=; b=N+GY1B26ZC4YQ3DlWWarnxVqDmWY9RGT8qD6fYZVQ3/1CKPNUx24wqb9JtR6utyiSn 4a2sAJbH7aoE4gd8g+y51muJT9NpaTGxWj2m2Z5IniSXFrRIDeTOznfQu/NZ1aFwdz7L 3A64JyaHdNVYe487Z5ISAKdU22wcV5ylXPMc3S14TtOxA6fqUtuwRmXm7ZjZMyRJYi2Y IEs1ZQXE6ZLVTqnB/u4/PqVc8OO6ck6dNK8pl9BetdQUpCIRfa0IJulHH7eV60TvVu8q Yb1HddFsLVMA2tEDOtXQCMMsdC0ZmJjJbuo141Co4m0Zo3GPOFUEWDmVYdFV7pwh2cDZ nlWQ== X-Forwarded-Encrypted: i=1; AHgh+RpPIkgbp6hJISZJcX6B/7x9rfom6nzEpbng2EQt8B0aT43CB7/bVNcidmw1bTJi8STRa3YnB5EA/lLDzHM=@vger.kernel.org X-Gm-Message-State: AOJu0YxkG+lnxbwcQ0sakiCENM/4OlFYD5CDTeU+8It0gstek0sGgGUX cAufU9BhsZ4VyZDDlVlvXLkdyADhdPmSLd69DAzWPaKuVSkwz6FR1M6f9Kulj0KqAyfgFzXk5c4 /pLQ6bA0+ig== X-Received: from dlep8-n2.prod.google.com ([2002:a05:701b:4588:20b0:13c:e55a:19d0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:c784:b0:3ba:f5c7:6bc3 with SMTP id adf61e73a8af0-3c44afcd253mr1547604637.10.1784782799976; Wed, 22 Jul 2026 21:59:59 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:46 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-4-irogers@google.com> Subject: [PATCH v7 3/6] perf ui hists: In report UI ensure thread is set with reference counting From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Populates the map_symbol thread in the UI code to fix the e_machine lookup for cross-platform disassembly when using the annotate action. At the same time, refactor the UI options and actions generation to comply with the perf subsystem's strict reference counting abstraction requirements for 'struct map_symbol' and 'struct thread'. Introduce explicit reference acquiring via map_symbol__copy() and thread__get() for menu items, safely clean them up between menu iterations using a new free_popup_actions() helper, and utilize insulated temporary action variables for direct hotkey handler execution. Fixes: 0e26ba5a8774 ("perf disasm: Refactor arch__find and initialization o= f arch structs") Reported-by: Josh Stone Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers --- tools/perf/ui/browsers/hists.c | 135 +++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 48 deletions(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index f5e13fc125c6..684df550ba49 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -2357,6 +2357,16 @@ static int hists_browser__scnprintf_title(struct his= t_browser *browser, char *bf return printed; } =20 +struct popup_action { + unsigned long time; + struct thread *thread; + int (*fn)(struct hist_browser *browser, struct popup_action *act); + struct map_symbol ms; + int socket; + enum rstype rstype; + +}; + static inline void free_popup_options(char **options, int n) { int i; @@ -2365,6 +2375,16 @@ static inline void free_popup_options(char **options= , int n) zfree(&options[i]); } =20 +static inline void free_popup_actions(struct popup_action *actions, int n) +{ + int i; + + for (i =3D 0; i < n; ++i) { + map_symbol__exit(&actions[i].ms); + memset(&actions[i], 0, sizeof(struct popup_action)); + } +} + /* * Only runtime switching of perf data file will make "input_name" point * to a malloced buffer. So add "is_input_name_malloced" flag to decide @@ -2454,16 +2474,6 @@ static int switch_data_file(void) return ret; } =20 -struct popup_action { - unsigned long time; - struct thread *thread; - int (*fn)(struct hist_browser *browser, struct popup_action *act); - struct map_symbol ms; - int socket; - enum rstype rstype; - -}; - static int do_annotate(struct hist_browser *browser, struct popup_action *act) { @@ -2541,7 +2551,7 @@ add_annotate_opt(struct popup_action *act, char **opt= str, if (asprintf(optstr, "Annotate %s", ms->sym->name) < 0) return 0; =20 - act->ms =3D *ms; + map_symbol__copy(&act->ms, ms); act->fn =3D do_annotate; return 1; } @@ -2573,7 +2583,7 @@ add_annotate_type_opt(struct popup_action *act, char = **optstr, static int do_zoom_thread(struct hist_browser *browser, struct popup_action *act) { - struct thread *thread =3D act->thread; + struct thread *thread =3D act->ms.thread; =20 if ((!hists__has(browser->hists, thread) && !hists__has(browser->hists, comm)) || thread =3D=3D NULL) @@ -2628,7 +2638,7 @@ add_thread_opt(struct hist_browser *browser, struct p= opup_action *act, if (ret < 0) return 0; =20 - act->thread =3D thread; + act->ms.thread =3D thread__get(thread); act->fn =3D do_zoom_thread; return 1; } @@ -2675,7 +2685,7 @@ add_dso_opt(struct hist_browser *browser, struct popu= p_action *act, __map__is_kernel(map) ? "the Kernel" : dso__short_name(map__dso(map= ))) < 0) return 0; =20 - act->ms.map =3D map; + act->ms.map =3D map__get(map); act->fn =3D do_zoom_dso; return 1; } @@ -2720,7 +2730,7 @@ add_map_opt(struct hist_browser *browser, if (asprintf(optstr, "Browse map details") < 0) return 0; =20 - act->ms.map =3D map; + act->ms.map =3D map__get(map); act->fn =3D do_browse_map; return 1; } @@ -2734,8 +2744,8 @@ do_run_script(struct hist_browser *browser, int n =3D 0; =20 len =3D 100; - if (act->thread) - len +=3D strlen(thread__comm_str(act->thread)); + if (act->ms.thread) + len +=3D strlen(thread__comm_str(act->ms.thread)); else if (act->ms.sym) len +=3D strlen(act->ms.sym->name); script_opt =3D malloc(len); @@ -2743,9 +2753,9 @@ do_run_script(struct hist_browser *browser, return -1; =20 script_opt[0] =3D 0; - if (act->thread) { + if (act->ms.thread) { n =3D scnprintf(script_opt, len, " -c %s ", - thread__comm_str(act->thread)); + thread__comm_str(act->ms.thread)); } else if (act->ms.sym) { n =3D scnprintf(script_opt, len, " -S %s ", act->ms.sym->name); @@ -2800,7 +2810,7 @@ add_script_opt_2(struct popup_action *act, char **opt= str, return 0; } =20 - act->thread =3D thread; + act->ms.thread =3D thread__get(thread); act->ms.sym =3D sym; act->fn =3D do_run_script; return 1; @@ -3097,6 +3107,8 @@ static int evsel__hists_browse(struct evsel *evsel, i= nt nr_events, const char *h =20 key =3D 0; // reset key do_hotkey: // key came straight from options ui__popup_menu() + free_popup_options(options, MAX_OPTIONS); + free_popup_actions(actions, MAX_OPTIONS); choice =3D nr_options =3D 0; key =3D hist_browser__run(browser, helpline, warn_lost_event, key); =20 @@ -3156,24 +3168,40 @@ static int evsel__hists_browse(struct evsel *evsel,= int nr_events, const char *h } =20 if (!browser->selection->sym) { + struct map_symbol source_ms; + if (!browser->he_selection) continue; =20 + memset(&source_ms, 0, sizeof(source_ms)); + if (sort__mode =3D=3D SORT_MODE__BRANCH) { bi =3D browser->he_selection->branch_info; if (!bi || !bi->to.ms.map) continue; =20 - actions->ms.sym =3D symbol__new_unresolved(bi->to.al_addr, bi->to.ms.= map); - actions->ms.map =3D bi->to.ms.map; + source_ms.sym =3D + symbol__new_unresolved( + bi->to.al_addr, + bi->to.ms.map); + source_ms.thread =3D bi->to.ms.thread; + source_ms.map =3D bi->to.ms.map; } else { - actions->ms.sym =3D symbol__new_unresolved(browser->he_selection->ip, - browser->selection->map); - actions->ms.map =3D browser->selection->map; + source_ms.sym =3D + symbol__new_unresolved( + browser->he_selection->ip, + browser->selection->map); + source_ms.thread =3D browser->selection->thread; + source_ms.map =3D browser->selection->map; } =20 - if (!actions->ms.sym) + if (!source_ms.sym) continue; + + memset(&hotkey_act, 0, sizeof(hotkey_act)); + map_symbol__copy(&hotkey_act.ms, &source_ms); + do_annotate(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); } else { if (symbol__annotation(browser->selection->sym)->src =3D=3D NULL) { ui_browser__warning(&browser->b, delay_secs * 2, @@ -3183,18 +3211,20 @@ static int evsel__hists_browse(struct evsel *evsel,= int nr_events, const char *h continue; } =20 - actions->ms.map =3D browser->selection->map; - actions->ms.sym =3D browser->selection->sym; + memset(&hotkey_act, 0, sizeof(hotkey_act)); + map_symbol__copy(&hotkey_act.ms, browser->selection); + do_annotate(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); } - - do_annotate(browser, actions); continue; case 'P': hist_browser__dump(browser); continue; case 'd': - actions->ms.map =3D map; - do_zoom_dso(browser, actions); + memset(&hotkey_act, 0, sizeof(hotkey_act)); + hotkey_act.ms.map =3D map__get(map); + do_zoom_dso(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); continue; case 'k': if (browser->selection !=3D NULL) @@ -3209,12 +3239,16 @@ static int evsel__hists_browse(struct evsel *evsel,= int nr_events, const char *h verbose); continue; case 't': - actions->thread =3D thread; - do_zoom_thread(browser, actions); + memset(&hotkey_act, 0, sizeof(hotkey_act)); + hotkey_act.ms.thread =3D thread__get(thread); + do_zoom_thread(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); continue; case 'S': - actions->socket =3D socked_id; - do_zoom_socket(browser, actions); + memset(&hotkey_act, 0, sizeof(hotkey_act)); + hotkey_act.socket =3D socked_id; + do_zoom_socket(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); continue; case '/': if (ui_browser__input_window("Symbol to show", @@ -3232,9 +3266,11 @@ static int evsel__hists_browse(struct evsel *evsel, = int nr_events, const char *h continue; case 'r': if (is_report_browser(hbt)) { - actions->thread =3D NULL; - actions->ms.sym =3D NULL; - do_run_script(browser, actions); + memset(&hotkey_act, 0, sizeof(hotkey_act)); + hotkey_act.ms.thread =3D NULL; + hotkey_act.ms.sym =3D NULL; + do_run_script(browser, &hotkey_act); + map_symbol__exit(&hotkey_act.ms); } continue; case 's': @@ -3306,20 +3342,19 @@ static int evsel__hists_browse(struct evsel *evsel,= int nr_events, const char *h =20 continue; } - actions->ms.map =3D map; + memset(&hotkey_act, 0, sizeof(hotkey_act)); top =3D pstack__peek(browser->pstack); if (top =3D=3D &browser->hists->dso_filter) { - /* - * No need to set actions->dso here since - * it's just to remove the current filter. - */ - do_zoom_dso(browser, actions); + hotkey_act.ms.map =3D map__get(map); + do_zoom_dso(browser, &hotkey_act); } else if (top =3D=3D &browser->hists->thread_filter) { - actions->thread =3D thread; - do_zoom_thread(browser, actions); + hotkey_act.ms.thread =3D thread__get(thread); + do_zoom_thread(browser, &hotkey_act); } else if (top =3D=3D &browser->hists->socket_filter) { - do_zoom_socket(browser, actions); + hotkey_act.socket =3D socked_id; + do_zoom_socket(browser, &hotkey_act); } + map_symbol__exit(&hotkey_act.ms); continue; } case 'q': @@ -3456,9 +3491,13 @@ static int evsel__hists_browse(struct evsel *evsel, = int nr_events, const char *h =20 if (key =3D=3D K_SWITCH_INPUT_DATA) break; + + free_popup_options(options, MAX_OPTIONS); + free_popup_actions(actions, MAX_OPTIONS); } out_free_stack: pstack__delete(browser->pstack); + free_popup_actions(actions, MAX_OPTIONS); out: hist_browser__delete(browser); free_popup_options(options, MAX_OPTIONS); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C8F139CD0F for ; Thu, 23 Jul 2026 05:00:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782807; cv=none; b=ZWhtcx4GmchlBWqm3b+nuRS8XwX8h3pv06cuhbVMwkJiLVxpz+rjUePUV0tAwbdqiSV1ZjxsccZOO6n7rc74QeGT+RPdi6WuyG6/7Vo/xiuVI1c5w02Kmab8OyWNGKcotwAEmPVVPDg8/XMMoph+vylGcoMs5XAMpxrTbpJIyCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782807; c=relaxed/simple; bh=j3RyNGJQm6/v+IqvksTWDcljilmfSjd3LPLSfoQI6YQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=agNRDTuGOHxRidsMxg1m/1vk6XKLXoaw1Po7YXdudG0RLzcWkQ0fndhaqnPcC0M+3lCqa5aDZLbT4m1fegP32o8l9NwMm6+Wfv0mO+bUvX+iIm9Jz46h9ZWRIpE6o21Y98fmwOwDyJfoFx9XGejK6gzPS7N1aw7cEawor8Yj1pM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Bw5U6mJD; arc=none smtp.client-ip=209.85.216.69 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Bw5U6mJD" Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-381abcccbf4so266904a91.3 for ; Wed, 22 Jul 2026 22:00:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782802; x=1785387602; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Sy1dwP6iLFsv4/zr7giqLZJWbJhcgJGpvJeI7JuRXnA=; b=Bw5U6mJDS/QeQSMHcn7CKz2/88/p1sQ2iL68HVy8oOuNYon2liU2tq99jz/i4w6CVF chh5gl1DyZIOjI93Gdp0Topm0PEkkkF3rp81DeAPY2fV2nJ7jQ2Uj5nGw055668QHPQP QUkXzYvnT/86cN4GvHGvbK9SjfZqXPQyUCs3/pasJNM9VSh8qB/u75yAHzb7pg7Q5IpR RG0/2bQchCazDd0ExotZDnHnsjygBXrDw2A+L/CDBBHutojPVAXJ4fyzEMXncnClUbQy Y/AFji8aIVQCJC7y3rI+Vez0slfJn3n5dYYCG64UzmieOfYZ+rPRIb5SEwam4H9QBCiz F9jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782802; x=1785387602; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Sy1dwP6iLFsv4/zr7giqLZJWbJhcgJGpvJeI7JuRXnA=; b=bl/3HOwNHrkBsOih2UbF3lYynFF+WOJuPG7H60VOWfjPZOQXEzfWWDEHd1pBGk0cHa j6LVGzQRXtq9KMj5s40a6ErICJH6Xs0lRMgeSlyNOag0HMaMTwzuzsA6sMQtnkSR5oaw DZFxYfNBxEYG1NbkNoezimLgeux++tnhB1kKvyyc/BWKuLTigyN8NL7ze7wLiAvKnCx8 2PgvhD0MZIiAA5TB1zkuxXrJU/5aqrfBVbxfP6m4bFsoq+a/ySmc7iNFinJN/OrHavnd LqGXaYkL+0YSWnvIk8gDQn/9agsq7nYb9Ab9/ycW7qWIHXWedm5HJXSBkNj2WOywL0dE Eygw== X-Forwarded-Encrypted: i=1; AHgh+RrIH8p4FCFUH5CAMRioyXZ37nNB+ySOGujHLwcflO0AIepDX5jc0KiniyAKUKc9COgvRQIf78Z4jUCeOr8=@vger.kernel.org X-Gm-Message-State: AOJu0Ywu6zLuDgtY3/iEcYPoRUXI9L3S8izLFWcm3neWThYiGai5V723 5O5s/n5e52x2018lbeus7mkmFes2u0l2yc8wHr7psesGH4TLrM4w6dByOCzhTOMWhu+0aPWxNaV TcIUvPej8TQ== X-Received: from dldz20-n2.prod.google.com ([2002:a05:701b:4194:20b0:13c:ce0f:370f]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d52:b0:387:e0db:bc26 with SMTP id 98e67ed59e1d1-38ec6600a76mr1485243a91.38.1784782802112; Wed, 22 Jul 2026 22:00:02 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:47 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-5-irogers@google.com> Subject: [PATCH v7 4/6] perf ui hists: Fix dso_filter reference leak and exit zoom cleanup From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In hists_browser__zoom_map(), the active dso is assigned as a raw pointer to hists->dso_filter without acquiring a reference using dso__get(). This creates a potential use-after-free defect if the underlying dso is released while the filter remains active. Fix it by properly acquiring a reference via dso__get() when assigning the filter, and releasing it with dso__put() when clearing it. Additionally, since the browser stack relies on pstack__new() and deletes it completely upon exiting, we must fully reset the persistent hists structure by un-eliding columns and recalculating histogram filter states for dso, thread, and symbols upon exit to guarantee immaculate, uncorrupted state across browser tab switching. Closes: https://lore.kernel.org/linux-perf-users/20260709170834.52F1A1F000E= 9@smtp.kernel.org/ Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers # Conflicts: # tools/perf/ui/browsers/hists.c --- tools/perf/ui/browsers/hists.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 684df550ba49..39d83f15f23c 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -2651,13 +2651,14 @@ static int hists_browser__zoom_map(struct hist_brow= ser *browser, struct map *map if (browser->hists->dso_filter) { pstack__remove(browser->pstack, &browser->hists->dso_filter); perf_hpp__set_elide(HISTC_DSO, false); + dso__put((struct dso *)browser->hists->dso_filter); browser->hists->dso_filter =3D NULL; ui_helpline__pop(); } else { struct dso *dso =3D map__dso(map); ui_helpline__fpush("To zoom out press ESC or ENTER + \"Zoom out of %s DS= O\"", __map__is_kernel(map) ? "the Kernel" : dso__short_name(dso)); - browser->hists->dso_filter =3D dso; + browser->hists->dso_filter =3D dso__get(dso); perf_hpp__set_elide(HISTC_DSO, true); pstack__push(browser->pstack, &browser->hists->dso_filter); } @@ -3025,7 +3026,7 @@ static int evsel__hists_browse(struct evsel *evsel, i= nt nr_events, const char *h struct branch_info *bi =3D NULL; #define MAX_OPTIONS 32 char *options[MAX_OPTIONS]; - struct popup_action actions[MAX_OPTIONS]; + struct popup_action actions[MAX_OPTIONS], hotkey_act; int nr_options =3D 0; int key =3D -1; char buf[128]; @@ -3498,6 +3499,13 @@ static int evsel__hists_browse(struct evsel *evsel, = int nr_events, const char *h out_free_stack: pstack__delete(browser->pstack); free_popup_actions(actions, MAX_OPTIONS); + thread__zput(hists->thread_filter); + dso__put((struct dso *)hists->dso_filter); + hists->dso_filter =3D NULL; + perf_hpp__set_elide(HISTC_DSO, false); + perf_hpp__set_elide(HISTC_THREAD, false); + hists__filter_by_dso(hists); + hists__filter_by_thread(hists); out: hist_browser__delete(browser); free_popup_options(options, MAX_OPTIONS); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B43B23A1A54 for ; Thu, 23 Jul 2026 05:00:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782809; cv=none; b=AWird7ZGvfxIFGNRXndduV6Oefqi8xNSikm10ck5NUUE4iwxxiXaEoSojacsjmkWKH9zQNoo32QoHXt6yfVcd7YA21mNSpWdISnyb7K9tFz6owRxWVmcF6HfjmwsJxGhJ6vdoh3NJcrw4QYdUN/1bOp6HbRIvMrX2wrpolMjk9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782809; c=relaxed/simple; bh=ur9sGuruywhNMqRiQsy1Ld6QOnicJt/sGJaHf6t0oVk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Q9kymMpZhjUYhZBCC2YmPz2b1a1r9cmcS9R9CPhCcYxgs7aWO2BrgkKgPRG/Vt6Jx+yaquRKha3H3klC0IO7yRLr8PT09K7fTcasNiHBS0oG7FtTbQgLjLqOiH+1+qP5KJGr+oib1A6+/EmuNBFMVVMQx4haFQwYjaxysbHDSh0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SSbp0LI6; arc=none smtp.client-ip=209.85.215.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SSbp0LI6" Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-cb835525b13so287260a12.1 for ; Wed, 22 Jul 2026 22:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782804; x=1785387604; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=6Dw3Ru1rBnPydLVKpmkZz3+u53JIr3+tqrnhDwtUDh4=; b=SSbp0LI6h5IrrlQTDdYUyhwr1+SjM5FYBp+D2xBLVmtjzcgDXfzPQn86t86Sv5C2rG agtiSU2m2dh1ez8JuAuoeCW0SWds2l3xe+1i8iy9TooGApsfffdNdgSecPeXLE4EU0PA UBWFsLpJuQxjxpcpHxlEJZZKOCXKxGMSC3sg07Gl62aaazvtML9oX1mfcImPFyIbQE0/ 42rCWOlbwkpPSQbks5lkK6mNx6Y+3W/ED/xk1p0NF/MpWgb+AGzr37JAwlkG4eGUaTxz llZzBfAyD0tJ+IvBi+SxV+uz7R77cWXkHNJBJd/1vYhW3PAc1WEQdc+BFt2TScFFKtoZ rBJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782804; x=1785387604; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6Dw3Ru1rBnPydLVKpmkZz3+u53JIr3+tqrnhDwtUDh4=; b=Tjov5tJe3dCDOJoKQQPL5At4HJlplTAmKEUb5SfSglHPat74pvVE9ebR2XAP2xFjFz Mvg2XZ8GPS4787B+4maDgx927MXOssaYrbvPpp3MVn/mz2lumaBMJSgxqPLe/ONjFARV bqj/Sk+iPbljQgy6s1efnf5MpmYu2z87R2srSuBpzGgiNYDaDWw3pjkjSrxLFgEM7iHE 8efFeJ2gwRK7Ljm1/InaXYGEIbBKqzbMOMJ/8bWYK/ecN9vqsH/zoz6TGkqBZM9hy9h6 yOvsnXL9e9PwgvyiWlXb9uIQ9SvUG0QvqX0HAJcbUc1PTKDaXyDKVx5HUpD1ieJ+Jief DZ7Q== X-Forwarded-Encrypted: i=1; AHgh+Rq0FL6bCqzW0lbXxzYYH/1f7qo+VXath6ym+EkvUb8TKs2NPssD60l0OOm+YcqlLNa7s/sCaDdHLaDhx/k=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8YLys4iZSg6QyyQAyro/bQkzRUhpYxtlOSSUSLTznSTIcLshJ 3ecvDyUMFMVtadrIHsR5kxJWOPG21N9u50bz0+hJFHWSnxdsDtW52SoHcRR/0a7/4lfInjGVv79 LAcLByoprKg== X-Received: from dycno8.prod.google.com ([2002:a05:7301:1448:b0:311:4853:3d70]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:394c:b0:3c3:7cb2:8aee with SMTP id adf61e73a8af0-3c44b21101emr1704557637.57.1784782803716; Wed, 22 Jul 2026 22:00:03 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:48 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-6-irogers@google.com> Subject: [PATCH v7 5/6] perf annotate: Be robust to annotating without a thread From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If a thread isn't given to map_symbol__get_arch(), try harder to determine the arch for disassembly. Do this by utilizing fallback paths such as reading the e_machine from a map's DSO ELF header for user-space libraries. Additionally, rely on map__kmaps() and maps__machine() to reliably extract the recorded machine environment and e_machine for kernel and kallsyms maps, perfectly preventing silent, incorrect host fallbacks to uname() during cross-platform Capstone annotation sessions. At the same time, ensure all remaining uses of a map_symbol's thread pointer do not assume it is non-NULL to eliminate UI segmentation faults, and remove the fragile, redundant thread__get_arch() function to streamline the annotate and disassembly subsystem architecture. Fixes: 0e26ba5a8774 ("perf disasm: Refactor arch__find and initialization o= f arch structs") Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers --- tools/perf/ui/browsers/annotate.c | 2 +- tools/perf/util/annotate.c | 51 ++++++++++++++++++++++--------- tools/perf/util/annotate.h | 3 +- tools/perf/util/capstone.c | 42 ++++++++++++++++++++----- 4 files changed, 74 insertions(+), 24 deletions(-) diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/ann= otate.c index d25761a8d25e..e47a46775089 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c @@ -1201,7 +1201,7 @@ int __hist_entry__tui_annotate(struct hist_entry *he,= struct map_symbol *ms, ui__warning("Annotation has no source code."); } } else { - err =3D thread__get_arch(ms->thread, &browser.arch); + err =3D map_symbol__get_arch(ms, &browser.arch); if (err) { annotate_browser__symbol_annotate_error(&browser, err); return -1; diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 53b2a224b21d..df70e95a8470 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -982,24 +982,43 @@ void symbol__calc_percent(struct symbol *sym, struct = evsel *evsel) annotation__calc_percent(notes, evsel, symbol__size(sym)); } =20 -int thread__get_arch(struct thread *thread, const struct arch **parch) + + +int map_symbol__get_arch(struct map_symbol *ms, const struct arch **parch) { const struct arch *arch; - struct machine *machine; - uint32_t e_flags; - uint16_t e_machine; + struct machine *machine =3D NULL; + struct map *map =3D ms->map; + struct dso *dso =3D map ? map__dso(map) : NULL; + uint32_t e_flags =3D 0; + uint16_t e_machine =3D EM_NONE; =20 - if (!thread) { - *parch =3D NULL; - return -1; + const char *cpuid =3D NULL; + + if (ms->thread) { + machine =3D maps__machine(thread__maps(ms->thread)); + e_machine =3D thread__e_machine(ms->thread, machine, &e_flags); + if (machine && machine->env) + cpuid =3D machine->env->cpuid; + } else if (dso) { + struct maps *kmaps =3D (map && dso__kernel(dso)) ? map__kmaps(map) : NUL= L; + struct machine *kmap_machine =3D kmaps ? maps__machine(kmaps) : NULL; + + e_machine =3D dso__e_machine(dso, kmap_machine, &e_flags); + if (kmap_machine && kmap_machine->env) + cpuid =3D kmap_machine->env->cpuid; } =20 - machine =3D maps__machine(thread__maps(thread)); - e_machine =3D thread__e_machine(thread, machine, &e_flags); - arch =3D arch__find(e_machine, e_flags, machine->env ? machine->env->cpui= d : NULL); + if (e_machine =3D=3D EM_NONE) + e_machine =3D thread__e_machine(NULL, NULL, &e_flags); + + arch =3D arch__find(e_machine, e_flags, cpuid); if (arch =3D=3D NULL) { pr_err("%s: unsupported arch %d\n", __func__, e_machine); - return errno; + /* TODO: Refactor annotate/disassemble subsystem error + * codes to uniformly return negative integers. + */ + return errno ? errno : ENOTSUP; } if (parch) *parch =3D arch; @@ -1018,7 +1037,7 @@ int symbol__annotate(struct map_symbol *ms, struct ev= sel *evsel, const struct arch *arch =3D NULL; int err, nr; =20 - err =3D thread__get_arch(ms->thread, &arch); + err =3D map_symbol__get_arch(ms, &arch); if (err) return err; =20 @@ -1251,6 +1270,11 @@ int hist_entry__annotate_printf(struct hist_entry *h= e, struct evsel *evsel) evsel_name =3D buf; } =20 + if (map_symbol__get_arch(ms, &apd.arch)) { + free(filename); + return ENOTSUP; + } + graph_dotted_len =3D printf(" %-*.*s| Source code & Disassembly of %s for= %s (%" PRIu64 " samples, " "percent: %s)\n", width, width, symbol_conf.show_total_period ? "Period" : @@ -1266,7 +1290,6 @@ int hist_entry__annotate_printf(struct hist_entry *he= , struct evsel *evsel) =20 apd.addr_fmt_width =3D annotated_source__addr_fmt_width(¬es->src->sour= ce, notes->src->start); - thread__get_arch(ms->thread, &apd.arch); apd.dbg =3D dso__debuginfo(dso); =20 list_for_each_entry(pos, ¬es->src->source, node) { @@ -1371,7 +1394,7 @@ static int symbol__annotate_fprintf2(struct symbol *s= ym, FILE *fp, struct annotation_line *al; =20 if (annotate_opts.code_with_type) { - thread__get_arch(apd->he->ms.thread, &apd->arch); + map_symbol__get_arch(&apd->he->ms, &apd->arch); apd->dbg =3D dso__debuginfo(map__dso(apd->he->ms.map)); } =20 diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index 1aa6df7d1618..fa08d09b80f7 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -584,5 +584,6 @@ int annotation_br_cntr_entry(char **str, int br_cntr_nr= , u64 *br_cntr, int num_aggr, struct evsel *evsel); int annotation_br_cntr_abbr_list(char **str, struct evsel *evsel, bool hea= der); =20 -int thread__get_arch(struct thread *thread, const struct arch **parch); + +int map_symbol__get_arch(struct map_symbol *ms, const struct arch **parch); #endif /* __PERF_ANNOTATE_H */ diff --git a/tools/perf/util/capstone.c b/tools/perf/util/capstone.c index 00e0141cae8d..74213daf8786 100644 --- a/tools/perf/util/capstone.c +++ b/tools/perf/util/capstone.c @@ -392,7 +392,7 @@ int symbol__disassemble_capstone(const char *filename, = struct symbol *sym, char disasm_buf[512]; struct disasm_line *dl; bool disassembler_style =3D false; - uint16_t e_machine; + uint16_t e_machine =3D EM_NONE; bool is_big_endian =3D false; =20 if (args->options->objdump_path) @@ -423,9 +423,22 @@ int symbol__disassemble_capstone(const char *filename,= struct symbol *sym, !strcmp(args->options->disassembler_style, "att")) disassembler_style =3D true; =20 - e_machine =3D thread__e_machine_endian(args->ms->thread, - /*machine=3D*/NULL, - /*e_flags=3D*/NULL, &is_big_endian); + if (args->ms->thread) { + e_machine =3D thread__e_machine_endian(args->ms->thread, + /*machine=3D*/NULL, + /*e_flags=3D*/NULL, &is_big_endian); + } else if (dso) { + struct maps *kmaps =3D (map && dso__kernel(dso)) ? map__kmaps(map) : NUL= L; + struct machine *kmap_machine =3D kmaps ? maps__machine(kmaps) : NULL; + + e_machine =3D dso__e_machine_endian(dso, kmap_machine, /*e_flags=3D*/NUL= L, + &is_big_endian); + } + if (!e_machine || e_machine =3D=3D EM_NONE) { + e_machine =3D thread__e_machine_endian(NULL, + /*machine=3D*/NULL, + /*e_flags=3D*/NULL, &is_big_endian); + } if (capstone_init(e_machine, &handle, is_64bit, is_big_endian, disassembl= er_style) < 0) goto err; =20 @@ -518,7 +531,7 @@ int symbol__disassemble_capstone_powerpc(const char *fi= lename __maybe_unused, struct disasm_line *dl; u32 *line; bool disassembler_style =3D false; - uint16_t e_machine; + uint16_t e_machine =3D EM_NONE; bool is_big_endian =3D false; =20 if (args->options->objdump_path) @@ -538,9 +551,22 @@ int symbol__disassemble_capstone_powerpc(const char *f= ilename __maybe_unused, !strcmp(args->options->disassembler_style, "att")) disassembler_style =3D true; =20 - e_machine =3D thread__e_machine_endian(args->ms->thread, - /*machine=3D*/NULL, - /*e_flags=3D*/NULL, &is_big_endian); + if (args->ms->thread) { + e_machine =3D thread__e_machine_endian(args->ms->thread, + /*machine=3D*/NULL, + /*e_flags=3D*/NULL, &is_big_endian); + } else if (dso) { + struct maps *kmaps =3D (map && dso__kernel(dso)) ? map__kmaps(map) : NUL= L; + struct machine *kmap_machine =3D kmaps ? maps__machine(kmaps) : NULL; + + e_machine =3D dso__e_machine_endian(dso, kmap_machine, /*e_flags=3D*/NUL= L, + &is_big_endian); + } + if (!e_machine || e_machine =3D=3D EM_NONE) { + e_machine =3D thread__e_machine_endian(NULL, + /*machine=3D*/NULL, + /*e_flags=3D*/NULL, &is_big_endian); + } if (capstone_init(e_machine, &handle, is_64bit, is_big_endian, disassembl= er_style) < 0) goto err; =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 05:21:42 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB0D836F411 for ; Thu, 23 Jul 2026 05:00:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782810; cv=none; b=hShutMiwoNLXYi0sCFnS4r9KPIHGmpiMb77B45LM/oo00F+fZk/7DuIFM0bpwtyQeMIvyRiCjCs/JGCld+J0iXqog7xAaCUbAbk4KjLW2rXd9T++oBKcWVXrKwFC38g7yie+ManBy0ZXzvHvsr1f+RtBWeEIN8Hwm6uaNO81c1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784782810; c=relaxed/simple; bh=RzionsZBC4nGIpNtaWh0rkqJMx56hR2GsoejTa1KkSg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YiQ6I52JsjKqMJJyTSdGtWet8m9yzt0ey8KfXcFRYxu7BeDhBJNrl6r4XO9GnyzJHcM7pgr83vtvjohhmLeRcZf7vFaqiXZ65CNCLmOlC3u5+DQd0pKz87lRU/Nw438AYLFzq10Rrw63eA+tpz+R6JUvQxCRl0Reu1m7dVnVQUg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=FL/mGxRd; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="FL/mGxRd" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cc6dd43737so7523785ad.2 for ; Wed, 22 Jul 2026 22:00:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784782806; x=1785387606; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=nunO8+EI5kPvayGER/zHbSlU+wwbYV/SYd2Npga2rpI=; b=FL/mGxRdP4CKIfPylgpWTQSMgSDcucAImIQePEu7pIFsm6GaZ9J6ujY3xtYg9JAYWB 4xmvBLJ/JuhvF3bswpYvIEq9BVA2Pw6PVgxn6cprL/vB0ED9RxhpYPNRJxky+0QVamP2 lURPBSU34tIbA4a/h4z2ZrJ+CSQtMPbS/p4dsMFl9ed8XWUp67lQ/pkFDONFcwh7E2R1 0cr9KrwahTiJhCJgbhOo3IvlfnPSZGJXQ/ObFkqIv8yBk2A42PAI8pgNVrXj9DIDR6NQ VKzjg/iQdrDYLpQ1U7XwzxcFJiIJEGGKyTD7XzxZ5kM25nNyerxaNklRar9BEzNMXfJz BeLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784782806; x=1785387606; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=nunO8+EI5kPvayGER/zHbSlU+wwbYV/SYd2Npga2rpI=; b=gRU8mlUMRdaXK3O/dkLyCCy/iK0ydRAkjvYLcnfRiXSgRE/6oDlTCyGj88GPl7i2GF 6PJUmqHDKWpy7mXrjfLlCGBToe5F+sNAnABiFGIMfU3jDIonsRZDtwJAsiPqwn8E+YRw 05OOU6samQyn7juKh3WwORCBKEwHL0XMEd1pB8kNmw+HzC1g7DL4X4XASXkYbJ7pQDoi 1I9ZPtQiT3ElviWbk1QHooajp//8iWGyP7BA/t9yE5r4xeBRE1d6NNLjShyEeQa74L8H XhmJ8hVrY84k6pmbd2jP6IAJe2fwxt3dAliuda+e5XdvUuRVd/FkrXD2KkpYgWvPTArg TXoQ== X-Forwarded-Encrypted: i=1; AHgh+Rp5ILDd2b8h4wHVZFUWfx/MCU1/BYXe4rDnDj5VV3fcMT03PaQCT4Ayk39V3kf4/qm4GE7ln1Wg9Mt59VA=@vger.kernel.org X-Gm-Message-State: AOJu0Yytp50rND1KvvRtD6dPUOO+dHduRXyCtClXmw2AIf3M618PFUvr XpH7KLHpYFGUg2URMQUXRxDU49SLzeuDvD8t03Z1pDjEEiDDnE2BKAXLj1rHZn7qJgsUQ1f8ZXK 6EpIsltpn3A== X-Received: from dycam20.prod.google.com ([2002:a05:7300:fc14:b0:30f:3f53:35d3]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f54c:b0:2c7:f4bd:91b5 with SMTP id d9443c01a7336-2cfa6b7aa7emr19683085ad.0.1784782806110; Wed, 22 Jul 2026 22:00:06 -0700 (PDT) Date: Wed, 22 Jul 2026 21:59:49 -0700 In-Reply-To: <20260723045949.988740-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260716072351.560311-1-irogers@google.com> <20260723045949.988740-1-irogers@google.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Message-ID: <20260723045949.988740-7-irogers@google.com> Subject: [PATCH v7 6/6] perf ui hists: Remove duplicated thread in popup_action From: Ian Rogers To: irogers@google.com, acme@kernel.org, namhyung@kernel.org Cc: adrian.hunter@intel.com, dapeng1.mi@linux.intel.com, james.clark@linaro.org, jistone@redhat.com, jolsa@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, tianyou.li@intel.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" struct popup_action has a thread but this is duplicated in the map_symbol. Remove the non-map_symbol version so that there's only ever 1 thread with a popup_action. Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Ian Rogers --- tools/perf/ui/browsers/hists.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 39d83f15f23c..c15874a491b4 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -2359,7 +2359,6 @@ static int hists_browser__scnprintf_title(struct hist= _browser *browser, char *bf =20 struct popup_action { unsigned long time; - struct thread *thread; int (*fn)(struct hist_browser *browser, struct popup_action *act); struct map_symbol ms; int socket; --=20 2.55.0.229.g6434b31f56-goog