109 lines
3.5 KiB
Diff
109 lines
3.5 KiB
Diff
From ba7a44da68adfa4f0d8285de4cdc16e3754929a8 Mon Sep 17 00:00:00 2001
|
|
From: Andrii Nakryiko <andrii@kernel.org>
|
|
Date: Thu, 25 May 2023 15:13:10 -0700
|
|
Subject: [PATCH] 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.
|
|
|
|
Conflict: NA
|
|
Reference:https://github.com/libbpf/libbpf/commit/ba7a44da68adfa4f0d8285de4cdc16e3754929a8
|
|
|
|
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
|
|
---
|
|
src/btf.c | 2 +-
|
|
src/libbpf.c | 6 +++---
|
|
src/libbpf_probes.c | 2 +-
|
|
src/usdt.c | 5 ++---
|
|
4 files changed, 7 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/src/btf.c b/src/btf.c
|
|
index 0a2c07924..8484b563b 100644
|
|
--- a/src/btf.c
|
|
+++ b/src/btf.c
|
|
@@ -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;
|
|
diff --git a/src/libbpf.c b/src/libbpf.c
|
|
index 1ceb3a97d..60ef4c5e3 100644
|
|
--- a/src/libbpf.c
|
|
+++ b/src/libbpf.c
|
|
@@ -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,
|
|
diff --git a/src/libbpf_probes.c b/src/libbpf_probes.c
|
|
index 6065f408a..5f78a023b 100644
|
|
--- a/src/libbpf_probes.c
|
|
+++ b/src/libbpf_probes.c
|
|
@@ -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;
|
|
|
|
diff --git a/src/usdt.c b/src/usdt.c
|
|
index 086eef355..f1a141555 100644
|
|
--- a/src/usdt.c
|
|
+++ b/src/usdt.c
|
|
@@ -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);
|
|
--
|
|
2.23.0
|