From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v9 03/18] perf env, dso, thread: Add _endian variants for e_machine helpers
Date: Sun, 03 May 2026 00:39:04 +0000 [thread overview]
Message-ID: <20260503003905.4B4F7C19425@smtp.kernel.org> (raw)
In-Reply-To: <20260503002248.1040791-4-irogers@google.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] thread__e_machine_endian() fast-path returns successfully without initializing the is_big_endian output parameter.
- [High] dso__e_machine_endian() bypasses lazy evaluation of env->arch, silently falling back to the host's endianness.
- [High] perf_arch_is_big_endian() falsely categorizes standard big-endian architectures (e.g., MIPS, m68k) as little-endian.
- [High] read_proc_e_machine_for_pid() uses a blocking open() on user-controlled /proc paths, risking an indefinite hang.
--
commit 34bedc0fb8b78f200595dbcc97e6be1af183988e
Author: Ian Rogers <irogers@google.com>
perf env, dso, thread: Add _endian variants for e_machine helpers
Add perf_arch_is_big_endian(), dso__read_e_machine_endian(),
dso__e_machine_endian(), and thread__e_machine_endian() to support
bi-endianness and cross-architecture analysis without breaking the
existing API.
> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
> index b791e1b6b2cf..6439b2a3c898 100644
> --- a/tools/perf/util/dso.c
> +++ b/tools/perf/util/dso.c
[ ... ]
> @@ -1308,9 +1313,11 @@ uint16_t dso__e_machine(struct dso *dso, struct machine *machine, uint32_t *e_fl
> case DSO_BINARY_TYPE__BPF_IMAGE:
> case DSO_BINARY_TYPE__OOL:
> case DSO_BINARY_TYPE__JAVA_JIT:
> - if (e_flags)
> - *e_flags = EF_HOST;
> - return EM_HOST;
> + if (is_big_endian) {
> + *is_big_endian = perf_arch_is_big_endian(
> + machine && machine->env ? machine->env->arch : NULL);
Could this direct access to machine->env->arch read a NULL pointer if the
architecture hasn't been lazily computed yet?
The arch string inside struct perf_env is lazily populated via
perf_env__arch(env). If NULL is passed to perf_arch_is_big_endian() here, it
will default to the host's byte order.
> + }
> + return perf_env__e_machine(machine ? machine->env : NULL, e_flags);
> case DSO_BINARY_TYPE__DEBUGLINK:
[ ... ]
> diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
> index 0edc67a468ab..1a4db133262b 100644
> --- a/tools/perf/util/env.c
> +++ b/tools/perf/util/env.c
[ ... ]
> @@ -339,6 +339,18 @@ int perf_env__kernel_is_64_bit(struct perf_env *env)
> return env->kernel_is_64_bit;
> }
>
> +bool perf_arch_is_big_endian(const char *arch)
> +{
> + if (!arch)
> + return __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__;
> +
> + if (str_ends_with(arch, "_be") || !strcmp(arch, "sparc") || !strcmp(arch, "sparc64") ||
> + !strcmp(arch, "s390") || !strcmp(arch, "s390x") || !strcmp(arch, "powerpc"))
> + return true;
> +
> + return false;
> +}
Does this check omit standard big-endian architectures like mips, m68k, and
parisc?
Because they aren't in the allowlist, cross-architecture analysis on a MIPS
kernel might return false, causing downstream consumers to be incorrectly
configured in little-endian mode.
> +
> int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[])
> {
[ ... ]
> diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
> index 22be77225bb0..8611293deca9 100644
> --- a/tools/perf/util/thread.c
> +++ b/tools/perf/util/thread.c
[ ... ]
> @@ -449,7 +449,7 @@ void thread__find_cpumode_addr_location(struct thread *thread, u64 addr,
> }
> }
>
> -static uint16_t read_proc_e_machine_for_pid(pid_t pid, uint32_t *e_flags)
> +static uint16_t read_proc_e_machine_for_pid(pid_t pid, uint32_t *e_flags, bool *is_big_endian)
> {
> char path[6 /* "/proc/" */ + 11 /* max length of pid */ + 5 /* "/exe\0" */];
> int fd;
> @@ -458,7 +458,8 @@ static uint16_t read_proc_e_machine_for_pid(pid_t pid, uint32_t *e_flags)
> snprintf(path, sizeof(path), "/proc/%d/exe", pid);
> fd = open(path, O_RDONLY);
Is it possible for this open() to hang indefinitely if the /proc/%d/exe path
points to a blocking FUSE filesystem or an unresponsive network mount?
Opening it without O_NONBLOCK risks hanging the perf daemon.
> if (fd >= 0) {
> - e_machine = dso__read_e_machine(/*optional_dso=*/NULL, fd, e_flags);
> + e_machine = dso__read_e_machine_endian(/*optional_dso=*/NULL, fd, e_flags,
> + is_big_endian);
> close(fd);
> }
[ ... ]
> @@ -491,6 +495,7 @@ uint16_t thread__e_machine(struct thread *thread, struct machine *machine, uint3
> .machine = machine,
> .e_flags = 0,
> .e_machine = EM_NONE,
> + .is_big_endian = false,
> };
>
> if (e_machine != EM_NONE) {
Does this fast-path return successfully without initializing the is_big_endian
output parameter?
Because struct thread does not cache the endianness, any caller relying on
is_big_endian might read uninitialized memory or a default value from their
stack.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260503002248.1040791-1-irogers@google.com?part=3
next prev parent reply other threads:[~2026-05-03 0:39 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-19 11:38 [PATCH v2] perf symbol: Remove psw_idle() from list of idle symbols Thomas Richter
2026-02-19 11:55 ` Jan Polensky
2026-02-23 21:46 ` Namhyung Kim
2026-02-23 23:14 ` Arnaldo Melo
2026-03-02 18:43 ` Arnaldo Carvalho de Melo
2026-03-02 19:44 ` Ian Rogers
2026-03-04 14:34 ` Arnaldo Carvalho de Melo
2026-03-02 23:43 ` [PATCH v1] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-03-24 17:14 ` Ian Rogers
2026-03-25 6:58 ` Namhyung Kim
2026-03-25 15:58 ` Ian Rogers
2026-03-25 16:18 ` [PATCH v2] " Ian Rogers
2026-03-26 7:20 ` Honglei Wang
2026-03-26 15:11 ` Ian Rogers
2026-03-26 17:45 ` [PATCH v3 0/2] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-03-26 17:45 ` [PATCH v3 1/2] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-03-26 17:45 ` [PATCH v3 2/2] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-03-27 6:56 ` Honglei Wang
2026-03-27 4:50 ` [PATCH v4 0/2] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-03-27 4:50 ` [PATCH v4 1/2] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-06 5:05 ` Namhyung Kim
2026-04-06 15:36 ` Ian Rogers
2026-03-27 4:50 ` [PATCH v4 2/2] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-06 5:10 ` Namhyung Kim
2026-04-06 16:11 ` Ian Rogers
2026-04-06 17:09 ` [PATCH v5 0/3] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-04-06 17:09 ` [PATCH v5 1/3] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-06 17:09 ` [PATCH v5 2/3] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-04-06 17:09 ` [PATCH v5 3/3] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-09 23:06 ` [PATCH v6 0/3] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-04-09 23:06 ` [PATCH v6 1/3] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-09 23:37 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 0/4] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-01 18:20 ` [PATCH v7 1/4] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-01 18:56 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 2/4] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-01 19:20 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 3/4] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-01 19:42 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 4/4] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
2026-05-01 20:13 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 00/17] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-02 6:59 ` [PATCH v8 01/17] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-02 7:56 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 02/17] perf tests topology: Switch env->arch use to env->e_machine Ian Rogers
2026-05-02 6:59 ` [PATCH v8 03/17] perf capstone: Determine architecture from e_machine Ian Rogers
2026-05-02 7:58 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 04/17] perf print_insn: Use e_machine for fallback IP length check Ian Rogers
2026-05-02 7:55 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 05/17] perf machine: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:11 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 06/17] perf sample-raw: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 07/17] perf sort: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 08/17] perf symbol: Avoid use of machine__is Ian Rogers
2026-05-02 7:17 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 09/17] perf arch common: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:59 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 10/17] perf header: In print_pmu_caps use perf_env e_machine Ian Rogers
2026-05-02 6:59 ` [PATCH v8 11/17] perf c2c: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:44 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 12/17] perf lock-contention: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 13/17] perf env: Refactor perf_env__arch_strerrno Ian Rogers
2026-05-02 6:59 ` [PATCH v8 14/17] perf env: Remove unused perf_env__raw_arch Ian Rogers
2026-05-02 6:59 ` [PATCH v8 15/17] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-02 7:53 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 16/17] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-02 7:55 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 17/17] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
2026-05-03 0:22 ` [PATCH v9 00/18] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-03 0:22 ` [PATCH v9 01/18] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-03 0:52 ` sashiko-bot
2026-05-04 1:35 ` Namhyung Kim
2026-05-03 0:22 ` [PATCH v9 02/18] perf tests topology: Switch env->arch use to env->e_machine Ian Rogers
2026-05-03 0:22 ` [PATCH v9 03/18] perf env, dso, thread: Add _endian variants for e_machine helpers Ian Rogers
2026-05-03 0:39 ` sashiko-bot [this message]
2026-05-03 0:22 ` [PATCH v9 04/18] perf capstone: Determine architecture from e_machine Ian Rogers
2026-05-03 0:50 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 05/18] perf print_insn: Use e_machine for fallback IP length check Ian Rogers
2026-05-03 0:22 ` [PATCH v9 06/18] perf symbol: Avoid use of machine__is Ian Rogers
2026-05-03 0:51 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 07/18] perf machine: Use perf_env e_machine rather than arch Ian Rogers
2026-05-03 1:00 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 08/18] perf sample-raw: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 09/18] perf sort: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 10/18] perf arch common: " Ian Rogers
2026-05-03 0:38 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 11/18] perf header: In print_pmu_caps use perf_env e_machine Ian Rogers
2026-05-03 0:22 ` [PATCH v9 12/18] perf c2c: Use perf_env e_machine rather than arch Ian Rogers
2026-05-03 0:22 ` [PATCH v9 13/18] perf lock-contention: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 14/18] perf env: Refactor perf_env__arch_strerrno Ian Rogers
2026-05-03 1:11 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 15/18] perf env: Remove unused perf_env__raw_arch Ian Rogers
2026-05-03 0:22 ` [PATCH v9 16/18] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-03 1:00 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 17/18] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-03 0:59 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 18/18] perf symbol: Lazily compute idle Ian Rogers
2026-05-03 1:11 ` sashiko-bot
2026-04-09 23:06 ` [PATCH v6 2/3] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-04-09 23:50 ` sashiko-bot
2026-04-09 23:06 ` [PATCH v6 3/3] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-10 0:11 ` sashiko-bot
2026-03-27 6:00 ` [PATCH v2] perf tests task-analyzer: Write test files to tmpdir Ian Rogers
2026-03-31 7:22 ` Namhyung Kim
2026-03-31 17:58 ` Ian Rogers
2026-04-01 3:41 ` Namhyung Kim
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=20260503003905.4B4F7C19425@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=irogers@google.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.