libbpf: Ensure libbpf always opens files with O_CLOEXEC
Make sure that libbpf code always gets FD with O_CLOEXEC flag set, regardless if file is open through open() or fopen(). For the latter this means to add "e" to mode string, which is supported since pretty ancient glibc v2.7. Also drop the outdated TODO comment in usdt.c, which was already completed. Suggested-by: Lennart Poettering <lennart@poettering.net> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20230525221311.2136408-1-andrii@kernel.org
This commit is contained in:
parent
321a64b328
commit
59842c5451
4 changed files with 7 additions and 8 deletions
|
@ -1064,7 +1064,7 @@ static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
long sz;
|
long sz;
|
||||||
|
|
||||||
f = fopen(path, "rb");
|
f = fopen(path, "rbe");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
|
@ -4351,7 +4351,7 @@ static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info)
|
||||||
snprintf(file, sizeof(file), "/proc/%d/fdinfo/%d", getpid(), fd);
|
snprintf(file, sizeof(file), "/proc/%d/fdinfo/%d", getpid(), fd);
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
||||||
fp = fopen(file, "r");
|
fp = fopen(file, "re");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pr_warn("failed to open %s: %d. No procfs support?\n", file,
|
pr_warn("failed to open %s: %d. No procfs support?\n", file,
|
||||||
|
@ -7455,7 +7455,7 @@ int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx)
|
||||||
int ret, err = 0;
|
int ret, err = 0;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
f = fopen("/proc/kallsyms", "r");
|
f = fopen("/proc/kallsyms", "re");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pr_warn("failed to open /proc/kallsyms: %d\n", err);
|
pr_warn("failed to open /proc/kallsyms: %d\n", err);
|
||||||
|
@ -10075,7 +10075,7 @@ static int parse_uint_from_file(const char *file, const char *fmt)
|
||||||
int err, ret;
|
int err, ret;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
f = fopen(file, "r");
|
f = fopen(file, "re");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pr_debug("failed to open '%s': %s\n", file,
|
pr_debug("failed to open '%s': %s\n", file,
|
||||||
|
|
|
@ -38,7 +38,7 @@ static __u32 get_ubuntu_kernel_version(void)
|
||||||
if (faccessat(AT_FDCWD, ubuntu_kver_file, R_OK, AT_EACCESS) != 0)
|
if (faccessat(AT_FDCWD, ubuntu_kver_file, R_OK, AT_EACCESS) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
f = fopen(ubuntu_kver_file, "r");
|
f = fopen(ubuntu_kver_file, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -466,7 +466,7 @@ static int parse_vma_segs(int pid, const char *lib_path, struct elf_seg **segs,
|
||||||
|
|
||||||
proceed:
|
proceed:
|
||||||
sprintf(line, "/proc/%d/maps", pid);
|
sprintf(line, "/proc/%d/maps", pid);
|
||||||
f = fopen(line, "r");
|
f = fopen(line, "re");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pr_warn("usdt: failed to open '%s' to get base addr of '%s': %d\n",
|
pr_warn("usdt: failed to open '%s' to get base addr of '%s': %d\n",
|
||||||
|
@ -954,8 +954,7 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct
|
||||||
spec_map_fd = bpf_map__fd(man->specs_map);
|
spec_map_fd = bpf_map__fd(man->specs_map);
|
||||||
ip_map_fd = bpf_map__fd(man->ip_to_spec_id_map);
|
ip_map_fd = bpf_map__fd(man->ip_to_spec_id_map);
|
||||||
|
|
||||||
/* TODO: perform path resolution similar to uprobe's */
|
fd = open(path, O_RDONLY | O_CLOEXEC);
|
||||||
fd = open(path, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
err = -errno;
|
err = -errno;
|
||||||
pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err);
|
pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err);
|
||||||
|
|
Loading…
Add table
Reference in a new issue