libbpf: Ensure libbpf always opens files with O_CLOEXEC
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 25 May 2023 22:13:10 +0000 (15:13 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 26 May 2023 10:05:32 +0000 (12:05 +0200)
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
tools/lib/bpf/btf.c
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf_probes.c
tools/lib/bpf/usdt.c

index 0a2c079244b6eed6d2b4347681cc8c331312b656..8484b563b53d0a70b73ff53faec0dec3db36bb33 100644 (file)
@@ -1064,7 +1064,7 @@ static struct btf *btf_parse_raw(const char *path, struct btf *base_btf)
        int err = 0;
        long sz;
 
-       f = fopen(path, "rb");
+       f = fopen(path, "rbe");
        if (!f) {
                err = -errno;
                goto err_out;
index 1ceb3a97dadc0af32c7631abfc21cf7e5ce971ed..60ef4c5e3bee78320f006e0ff63f87d29ed77de6 100644 (file)
@@ -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);
        memset(info, 0, sizeof(*info));
 
-       fp = fopen(file, "r");
+       fp = fopen(file, "re");
        if (!fp) {
                err = -errno;
                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;
        FILE *f;
 
-       f = fopen("/proc/kallsyms", "r");
+       f = fopen("/proc/kallsyms", "re");
        if (!f) {
                err = -errno;
                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;
        FILE *f;
 
-       f = fopen(file, "r");
+       f = fopen(file, "re");
        if (!f) {
                err = -errno;
                pr_debug("failed to open '%s': %s\n", file,
index 6065f408a59c1ccab4ed072bed8c6f766dc671d6..5f78a023b47451e55e376ba5eb509dcc8089bf94 100644 (file)
@@ -38,7 +38,7 @@ static __u32 get_ubuntu_kernel_version(void)
        if (faccessat(AT_FDCWD, ubuntu_kver_file, R_OK, AT_EACCESS) != 0)
                return 0;
 
-       f = fopen(ubuntu_kver_file, "r");
+       f = fopen(ubuntu_kver_file, "re");
        if (!f)
                return 0;
 
index 086eef355ab3d525baef3beae17e9b4dbc8c17fd..f1a141555f08470cf829f21deafbdb5696081b02 100644 (file)
@@ -466,7 +466,7 @@ static int parse_vma_segs(int pid, const char *lib_path, struct elf_seg **segs,
 
 proceed:
        sprintf(line, "/proc/%d/maps", pid);
-       f = fopen(line, "r");
+       f = fopen(line, "re");
        if (!f) {
                err = -errno;
                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);
        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);
+       fd = open(path, O_RDONLY | O_CLOEXEC);
        if (fd < 0) {
                err = -errno;
                pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err);