perf tools: Use mkostemp() for O_CLOEXEC on temporary files

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: 42b3fa6708 ("perf tools: Introduce dso__decompress_kmodule_{fd,path}")
Fixes: b10f74308e ("perf symbol: Support .gnu_debugdata for symbols")
Fixes: afba19d9dc ("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>
This commit is contained in:
Arnaldo Carvalho de Melo 2026-06-07 21:06:12 -03:00
parent 9c74f0aab3
commit b8acc68f13
2 changed files with 4 additions and 4 deletions

View 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;

View 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)