-
Notifications
You must be signed in to change notification settings - Fork 475
Description
Description
While working on the proc package, I've encountered an issue again regarding the appropriate types to use for specific fields across Tracee (both in BPF and userspace).
To summarize, focusing on the pid field. In BPF, we retrieve it using bpf_get_current_pid_tgid:
https://elixir.bootlin.com/linux/v6.12.6/source/kernel/bpf/helpers.c#L222
We typically extract pid and tgid as u32 each, which is a misconception induced by the helper function.
In reality, both are defined as pid_t:
https://elixir.bootlin.com/linux/v6.12.6/source/include/linux/sched.h#L1018
pid_t is, in turn, defined as __kernel_pid_t:
https://elixir.bootlin.com/linux/v6.12.6/source/include/linux/types.h#L27
which is an int or s32:
https://elixir.bootlin.com/linux/v6.12.6/source/include/uapi/asm-generic/posix_types.h#L28.
This means we've been treating them as unsigned when they should be signed, or as int in Go which has an unnecessary int64 footprint. Beyond interpreting values incorrectly, this also leads to unnecessary conversions throughout the code.
The kernel itself makes use of pid_t as -1:
https://elixir.bootlin.com/linux/v6.12.6/source/kernel/exit.c#L1832
https://elixir.bootlin.com/linux/v6.12.6/source/kernel/pid_namespace.c#L222
https://elixir.bootlin.com/linux/v6.12.6/source/kernel/trace/trace_functions_graph.c#L1333
...
Additional details
Related: