Linux Perf Users
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: sashiko-reviews@lists.linux.dev
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 07/11] perf tools: Add O_CLOEXEC to open() calls in DSO and ELF code
Date: Wed, 10 Jun 2026 13:49:37 -0300	[thread overview]
Message-ID: <aimVobFTV8MZ0pFy@x1> (raw)
In-Reply-To: <20260609011626.DE73D1F00893@smtp.kernel.org>

On Tue, Jun 09, 2026 at 01:16:26AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> 
> New issues:
> - [High] Incomplete fix for file descriptor leaks in DSO and ELF code.
> 
> Pre-existing issues:
> - [Critical] Stack buffer overflow in sysfs__read_build_id when skipping non-matching GNU notes.
> --
> 
> commit 66274b4049c9a2092defa7caf237fe0295853d9c
> Author: Arnaldo Carvalho de Melo <acme@redhat.com>
> 
> perf tools: Add O_CLOEXEC to open() calls in DSO and ELF code
> 
> The commit adds O_CLOEXEC to open() calls in dso.c and symbol-elf.c to
> prevent leaking file descriptors to child processes during symbol
> resolution.
> 
> > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
> > index 7dced896c64ea..fb2e78fe2aa8e 100644
> > --- a/tools/perf/util/dso.c
> > +++ b/tools/perf/util/dso.c
> > @@ -344,7 +344,7 @@ int filename__decompress(const char *name, char *pathname,
> >  	 * descriptor to the uncompressed file.
> >  	 */
> >  	if (!compressions[comp].is_compressed(name))
> > -		return open(name, O_RDONLY);
> > +		return open(name, O_RDONLY | O_CLOEXEC);
> >  
> >  	fd = mkstemp(tmpbuf);
> 
> [Severity: High]
> Since the goal of this patch is to prevent leaking file descriptors to child
> processes, should we also address the mkstemp() calls in these files?
> 
> mkstemp() creates file descriptors without O_CLOEXEC. For instance, here in
> filename__decompress(), the temporary file descriptor will still be leaked.
> Should mkostemp(tmpbuf, O_CLOEXEC) be used instead?

This is fixed in the next patch series.
 
> [ ... ]
> > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> > index 186e6d92ac3d7..c2bdfd0003df2 100644
> > --- a/tools/perf/util/symbol-elf.c
> > +++ b/tools/perf/util/symbol-elf.c
> [ ... ]
> > @@ -935,7 +935,7 @@ int sysfs__read_build_id(const char *filename, struct build_id *bid)
> >  	size_t size = sizeof(bid->data);
> >  	int fd, err = -1;
> >  
> > -	fd = open(filename, O_RDONLY);
> > +	fd = open(filename, O_RDONLY | O_CLOEXEC);
> >  	if (fd < 0)
> >  		goto out;
> 
> [Severity: Critical]
> This is a pre-existing issue, but while reviewing this function, could
> an unbounded read() happen later in sysfs__read_build_id() when skipping
> non-matching GNU notes?
> 
> If a crafted sysfs note has a maliciously large nhdr.n_descsz, the code does:
> 
>     } else if (read(fd, bf, descsz) != (ssize_t)descsz)
> 
> Since bf is a fixed-size stack array (char bf[BUFSIZ]), could this read past
> the end of bf and overwrite the stack frame if descsz exceeds BUFSIZ?

Ditto, as several other issues you reported in this series and in other
series.

- Arnaldo
 
> [ ... ]
> > @@ -1985,7 +1985,7 @@ static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
> >  	if (temp)
> >  		kcore->fd = mkstemp(filename);
> >  	else
> > -		kcore->fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400);
> > +		kcore->fd = open(filename, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, 0400);
> >  	if (kcore->fd == -1)
> >  		return -1;
> 
> [Severity: High]
> Similarly to the issue in filename__decompress(), if temp is true here,
> mkstemp() is called without O_CLOEXEC.
> 
> There is also a similar mkstemp() call in read_gnu_debugdata() in this file
> that extracts debug data without O_CLOEXEC. Should all of these be updated
> to prevent leaking file descriptors?
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20260609010526.1998472-1-acme@kernel.org?part=7

  reply	other threads:[~2026-06-10 16:49 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-09  1:05 [PATCHES v4 00/11] perf tools: Assorted fixes Arnaldo Carvalho de Melo
2026-06-09  1:05 ` [PATCH 01/11] perf tools: Fix get_max_num() size_t underflow on empty sysfs file Arnaldo Carvalho de Melo
2026-06-09  1:24   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 02/11] perf tools: Use scnprintf() in cpu_map__snprint() to prevent overflow Arnaldo Carvalho de Melo
2026-06-09  1:05 ` [PATCH 03/11] perf tools: Use perf_env__get_cpu_topology() in machine__resolve() Arnaldo Carvalho de Melo
2026-06-09  1:22   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 04/11] perf tools: NULL bitmap pointers after bitmap_free() Arnaldo Carvalho de Melo
2026-06-09  1:23   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 05/11] perf sched: Bounds-check prio before test_bit() in timehist Arnaldo Carvalho de Melo
2026-06-09  1:05 ` [PATCH 06/11] perf sched: Fix idle-hist callchain display using wrong rb_first variant Arnaldo Carvalho de Melo
2026-06-09  1:18   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 07/11] perf tools: Add O_CLOEXEC to open() calls in DSO and ELF code Arnaldo Carvalho de Melo
2026-06-09  1:16   ` sashiko-bot
2026-06-10 16:49     ` Arnaldo Carvalho de Melo [this message]
2026-06-09  1:05 ` [PATCH 08/11] perf bpf: Use scnprintf() in snprintf_hex() and synthesize_bpf_prog_name() Arnaldo Carvalho de Melo
2026-06-09  1:18   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 09/11] perf hists: Fix snprintf() in hists__scnprintf_title() UID filter path Arnaldo Carvalho de Melo
2026-06-09  1:23   ` sashiko-bot
2026-06-09  1:05 ` [PATCH 10/11] perf tools: Use scnprintf() in build_id__snprintf() and hwmon read_events() Arnaldo Carvalho de Melo
2026-06-09  1:17   ` sashiko-bot
2026-06-10 16:29     ` Arnaldo Carvalho de Melo
2026-06-09  1:05 ` [PATCH 11/11] libperf: Document code simplification case for widening struct perf_cpu Arnaldo Carvalho de Melo
  -- strict thread matches above, loose matches on Subject: below --
2026-06-10 16:51 [PATCHES v5 00/11] perf tools: Assorted fixes Arnaldo Carvalho de Melo
2026-06-10 16:52 ` [PATCH 07/11] perf tools: Add O_CLOEXEC to open() calls in DSO and ELF code Arnaldo Carvalho de Melo
2026-06-10 17:10   ` sashiko-bot
2026-06-08 20:17 [PATCHES v3 00/11] perf tools: Assorted fixes Arnaldo Carvalho de Melo
2026-06-08 20:17 ` [PATCH 07/11] perf tools: Add O_CLOEXEC to open() calls in DSO and ELF code Arnaldo Carvalho de Melo
2026-06-08 20:40   ` sashiko-bot
2026-06-08 22:01   ` Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aimVobFTV8MZ0pFy@x1 \
    --to=acme@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox