Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfd49210 authored by Michal Rostecki's avatar Michal Rostecki Committed by Alexei Starovoitov
Browse files

libbpf: Return btf_fd for load_sk_storage_btf



Before this change, function load_sk_storage_btf expected that
libbpf__probe_raw_btf was returning a BTF descriptor, but in fact it was
returning an information about whether the probe was successful (0 or
1). load_sk_storage_btf was using that value as an argument of the close
function, which was resulting in closing stdout and thus terminating the
process which called that function.

That bug was visible in bpftool. `bpftool feature` subcommand was always
exiting too early (because of closed stdout) and it didn't display all
requested probes. `bpftool -j feature` or `bpftool -p feature` were not
returning a valid json object.

This change renames the libbpf__probe_raw_btf function to
libbpf__load_raw_btf, which now returns a BTF descriptor, as expected in
load_sk_storage_btf.

v2:
- Fix typo in the commit message.

v3:
- Simplify BTF descriptor handling in bpf_object__probe_btf_* functions.
- Rename libbpf__probe_raw_btf function to libbpf__load_raw_btf and
return a BTF descriptor.

v4:
- Fix typo in the commit message.

Fixes: d7c4b398 ("libbpf: detect supported kernel BTF features and sanitize BTF")
Signed-off-by: default avatarMichal Rostecki <mrostecki@opensuse.org>
Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
Acked-by: default avatarSong Liu <songliubraving@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 5fac1718
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -1645,14 +1645,16 @@ static int bpf_object__probe_btf_func(struct bpf_object *obj)
		/* FUNC x */                                    /* [3] */
		BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2),
	};
	int res;
	int btf_fd;

	res = libbpf__probe_raw_btf((char *)types, sizeof(types),
	btf_fd = libbpf__load_raw_btf((char *)types, sizeof(types),
				      strs, sizeof(strs));
	if (res < 0)
		return res;
	if (res > 0)
	if (btf_fd >= 0) {
		obj->caps.btf_func = 1;
		close(btf_fd);
		return 1;
	}

	return 0;
}

@@ -1670,14 +1672,16 @@ static int bpf_object__probe_btf_datasec(struct bpf_object *obj)
		BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4),
		BTF_VAR_SECINFO_ENC(2, 0, 4),
	};
	int res;
	int btf_fd;

	res = libbpf__probe_raw_btf((char *)types, sizeof(types),
	btf_fd = libbpf__load_raw_btf((char *)types, sizeof(types),
				      strs, sizeof(strs));
	if (res < 0)
		return res;
	if (res > 0)
	if (btf_fd >= 0) {
		obj->caps.btf_datasec = 1;
		close(btf_fd);
		return 1;
	}

	return 0;
}

+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ do { \
#define pr_info(fmt, ...)	__pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
#define pr_debug(fmt, ...)	__pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)

int libbpf__probe_raw_btf(const char *raw_types, size_t types_len,
int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
			 const char *str_sec, size_t str_len);

#endif /* __LIBBPF_LIBBPF_INTERNAL_H */
+4 −9
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ bool bpf_probe_prog_type(enum bpf_prog_type prog_type, __u32 ifindex)
	return errno != EINVAL && errno != EOPNOTSUPP;
}

int libbpf__probe_raw_btf(const char *raw_types, size_t types_len,
int libbpf__load_raw_btf(const char *raw_types, size_t types_len,
			 const char *str_sec, size_t str_len)
{
	struct btf_header hdr = {
@@ -157,14 +157,9 @@ int libbpf__probe_raw_btf(const char *raw_types, size_t types_len,
	memcpy(raw_btf + hdr.hdr_len + hdr.type_len, str_sec, hdr.str_len);

	btf_fd = bpf_load_btf(raw_btf, btf_len, NULL, 0, false);
	if (btf_fd < 0) {
		free(raw_btf);
		return 0;
	}

	close(btf_fd);
	free(raw_btf);
	return 1;
	return btf_fd;
}

static int load_sk_storage_btf(void)
@@ -190,7 +185,7 @@ static int load_sk_storage_btf(void)
		BTF_MEMBER_ENC(23, 2, 32),/* struct bpf_spin_lock l; */
	};

	return libbpf__probe_raw_btf((char *)types, sizeof(types),
	return libbpf__load_raw_btf((char *)types, sizeof(types),
				     strs, sizeof(strs));
}