On 2/12/26 01:13, Ihor Solodrai wrote:
> The bpftool_maps_access and bpftool_metadata tests may fail on BPF CI
> with "command not found", depending on a workflow.
> This happens because detect_bpftool_path() only checks two hardcoded
> relative paths:
> - ./tools/sbin/bpftool
> - ../tools/sbin/bpftool
>
> Add support for a BPFTOOL environment variable that allows specifying
> the exact path to the bpftool binary.
>
> Also replace strncpy() with snprintf() for proper null-termination.
>
> Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
> ---
> tools/testing/selftests/bpf/bpftool_helpers.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/bpftool_helpers.c b/tools/testing/selftests/bpf/bpftool_helpers.c
> index a5824945a4a5..5435ecd720d1 100644
> --- a/tools/testing/selftests/bpf/bpftool_helpers.c
> +++ b/tools/testing/selftests/bpf/bpftool_helpers.c
> @@ -12,13 +12,21 @@
> static int detect_bpftool_path(char *buffer)
> {
> char tmp[BPFTOOL_PATH_MAX_LEN];
> + const char *env_path;
> +
> + /* First, check if BPFTOOL environment variable is set */
> + env_path = getenv("BPFTOOL");
> + if (env_path && access(env_path, X_OK) == 0) {
nit: we are checking access(path, X_OK) in multiple places in this function,
but never report any failures if those checks fail, it may be confusing
for user,
as file is there but function fails to find bpftool binary.
> + snprintf(buffer, BPFTOOL_PATH_MAX_LEN, "%s", env_path);
> + return 0;
> + }
>
> /* Check default bpftool location (will work if we are running the
> * default flavor of test_progs)
> */
> snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "./%s", BPFTOOL_DEFAULT_PATH);
> if (access(tmp, X_OK) == 0) {
> - strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN);
> + snprintf(buffer, BPFTOOL_PATH_MAX_LEN, "%s", tmp);
> return 0;
> }
>
> @@ -27,7 +35,7 @@ static int detect_bpftool_path(char *buffer)
> */
> snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "../%s", BPFTOOL_DEFAULT_PATH);
> if (access(tmp, X_OK) == 0) {
> - strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN);
> + snprintf(buffer, BPFTOOL_PATH_MAX_LEN, "%s", tmp);
> return 0;
> }
>