]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf tools: Use mkostemp() for O_CLOEXEC on temporary files
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 8 Jun 2026 00:06:12 +0000 (21:06 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 10 Jun 2026 21:56:01 +0000 (18:56 -0300)
mkstemp() creates file descriptors without the close-on-exec flag.
These fds leak to child processes spawned during symbol resolution
(addr2line, objdump), wasting descriptors and potentially exposing
temporary file contents.

Replace mkstemp() with mkostemp(tmpbuf, O_CLOEXEC) at all three
call sites:

  - filename__decompress() in dso.c
  - read_gnu_debugdata() in symbol-elf.c
  - kcore__init() in symbol-elf.c

Fixes: 42b3fa670825983f ("perf tools: Introduce dso__decompress_kmodule_{fd,path}")
Fixes: b10f74308e130527 ("perf symbol: Support .gnu_debugdata for symbols")
Fixes: afba19d9dc8eba66 ("perf symbols: Workaround objdump difficulties with kcore")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/dso.c
tools/perf/util/symbol-elf.c

index fb2e78fe2aa8eb9474b4ac89cf4c39e1644e12ff..ee06a252a54d338d41f4bd8a387e0b4c38635146 100644 (file)
@@ -346,7 +346,7 @@ int filename__decompress(const char *name, char *pathname,
        if (!compressions[comp].is_compressed(name))
                return open(name, O_RDONLY | O_CLOEXEC);
 
-       fd = mkstemp(tmpbuf);
+       fd = mkostemp(tmpbuf, O_CLOEXEC);
        if (fd < 0) {
                *err = errno;
                return -1;
index 51e7cfe0f5934875e6b90e88463021ed521f26eb..36a0304707e131389035ad06dbfe5f4f985663b4 100644 (file)
@@ -1119,9 +1119,9 @@ static Elf *read_gnu_debugdata(struct dso *dso, Elf *elf, const char *name, int
                return NULL;
        }
 
-       temp_fd = mkstemp(temp_filename);
+       temp_fd = mkostemp(temp_filename, O_CLOEXEC);
        if (temp_fd < 0) {
-               pr_debug("%s: mkstemp: %m\n", __func__);
+               pr_debug("%s: mkostemp: %m\n", __func__);
                *dso__load_errno(dso) = -errno;
                fclose(wrapped);
                return NULL;
@@ -1993,7 +1993,7 @@ static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
        kcore->elfclass = elfclass;
 
        if (temp)
-               kcore->fd = mkstemp(filename);
+               kcore->fd = mkostemp(filename, O_CLOEXEC);
        else
                kcore->fd = open(filename, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, 0400);
        if (kcore->fd == -1)