Skip to content

Commit 08ec21c

Browse files
Yucong SunNobody
authored andcommitted
bpf: Fix issue with bpf preload module taking over stdout/stdin of kernel.
In a previous commit (1), BPF preload process was switched from user mode process to use in-kernel light skeleton instead. However, in the kernel context the available fd starts from 0, instead of normally 3 for user mode process. and the preload process leaked two FDs, taking over FD 0 and 1. This which later caused issues when kernel trys to setup stdin/stdout/stderr for init process, assuming fd 0,1,2 is available. As seen here: Before fix: ls -lah /proc/1/fd/* lrwx------1 root root 64 Feb 23 17:20 /proc/1/fd/0 -> /dev/null lrwx------ 1 root root 64 Feb 23 17:20 /proc/1/fd/1 -> /dev/null lrwx------ 1 root root 64 Feb 23 17:20 /proc/1/fd/2 -> /dev/console lrwx------ 1 root root 64 Feb 23 17:20 /proc/1/fd/6 -> /dev/console lrwx------ 1 root root 64 Feb 23 17:20 /proc/1/fd/7 -> /dev/console After Fix / Normal: ls -lah /proc/1/fd/* lrwx------ 1 root root 64 Feb 24 21:23 /proc/1/fd/0 -> /dev/console lrwx------ 1 root root 64 Feb 24 21:23 /proc/1/fd/1 -> /dev/console lrwx------ 1 root root 64 Feb 24 21:23 /proc/1/fd/2 -> /dev/console In this patch: - skel_closenz was changed to skel_closenez to correctly handle FD=0 case. - various places detecting FD > 0 was changed to FD >= 0. - Call iterators_skel__detach() funciton to release FDs after links are obtained. 1: kernel-patches/bpf@cb80ddc Signed-off-by: Yucong Sun <[email protected]>
1 parent 937b965 commit 08ec21c

File tree

4 files changed

+19
-15
lines changed

4 files changed

+19
-15
lines changed

kernel/bpf/preload/bpf_preload_kern.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ static int load_skel(void)
5454
err = PTR_ERR(progs_link);
5555
goto out;
5656
}
57+
iterators_bpf__detach(skel);
5758
return 0;
5859
out:
5960
free_links_and_skel();

kernel/bpf/preload/iterators/iterators.lskel.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ iterators_bpf__dump_bpf_map__attach(struct iterators_bpf *skel)
2828
int prog_fd = skel->progs.dump_bpf_map.prog_fd;
2929
int fd = skel_link_create(prog_fd, 0, BPF_TRACE_ITER);
3030

31-
if (fd > 0)
31+
if (fd >= 0)
3232
skel->links.dump_bpf_map_fd = fd;
3333
return fd;
3434
}
@@ -39,7 +39,7 @@ iterators_bpf__dump_bpf_prog__attach(struct iterators_bpf *skel)
3939
int prog_fd = skel->progs.dump_bpf_prog.prog_fd;
4040
int fd = skel_link_create(prog_fd, 0, BPF_TRACE_ITER);
4141

42-
if (fd > 0)
42+
if (fd >= 0)
4343
skel->links.dump_bpf_prog_fd = fd;
4444
return fd;
4545
}
@@ -57,19 +57,21 @@ iterators_bpf__attach(struct iterators_bpf *skel)
5757
static inline void
5858
iterators_bpf__detach(struct iterators_bpf *skel)
5959
{
60-
skel_closenz(skel->links.dump_bpf_map_fd);
61-
skel_closenz(skel->links.dump_bpf_prog_fd);
60+
skel_closenez(skel->links.dump_bpf_map_fd);
61+
skel->links.dump_bpf_map_fd = -1;
62+
skel_closenez(skel->links.dump_bpf_prog_fd);
63+
skel->links.dump_bpf_prog_fd = -1;
6264
}
6365
static void
6466
iterators_bpf__destroy(struct iterators_bpf *skel)
6567
{
6668
if (!skel)
6769
return;
6870
iterators_bpf__detach(skel);
69-
skel_closenz(skel->progs.dump_bpf_map.prog_fd);
70-
skel_closenz(skel->progs.dump_bpf_prog.prog_fd);
71+
skel_closenez(skel->progs.dump_bpf_map.prog_fd);
72+
skel_closenez(skel->progs.dump_bpf_prog.prog_fd);
7173
skel_free_map_data(skel->rodata, skel->maps.rodata.initial_value, 4096);
72-
skel_closenz(skel->maps.rodata.map_fd);
74+
skel_closenez(skel->maps.rodata.map_fd);
7375
skel_free(skel);
7476
}
7577
static inline struct iterators_bpf *

tools/bpf/bpftool/gen.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ static void codegen_attach_detach(struct bpf_object *obj, const char *obj_name)
469469
codegen("\
470470
\n\
471471
\n\
472-
if (fd > 0) \n\
472+
if (fd >= 0) \n\
473473
skel->links.%1$s_fd = fd; \n\
474474
return fd; \n\
475475
} \n\
@@ -506,7 +506,8 @@ static void codegen_attach_detach(struct bpf_object *obj, const char *obj_name)
506506
bpf_object__for_each_program(prog, obj) {
507507
codegen("\
508508
\n\
509-
skel_closenz(skel->links.%1$s_fd); \n\
509+
skel_closenez(skel->links.%1$s_fd); \n\
510+
skel->links.%1$s_fd = -1; \n\
510511
", bpf_program__name(prog));
511512
}
512513

@@ -536,7 +537,7 @@ static void codegen_destroy(struct bpf_object *obj, const char *obj_name)
536537
bpf_object__for_each_program(prog, obj) {
537538
codegen("\
538539
\n\
539-
skel_closenz(skel->progs.%1$s.prog_fd); \n\
540+
skel_closenez(skel->progs.%1$s.prog_fd); \n\
540541
", bpf_program__name(prog));
541542
}
542543

@@ -549,7 +550,7 @@ static void codegen_destroy(struct bpf_object *obj, const char *obj_name)
549550
ident, bpf_map_mmap_sz(map));
550551
codegen("\
551552
\n\
552-
skel_closenz(skel->maps.%1$s.map_fd); \n\
553+
skel_closenez(skel->maps.%1$s.map_fd); \n\
553554
", ident);
554555
}
555556
codegen("\

tools/lib/bpf/skel_internal.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,11 @@ static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int
204204
}
205205
#endif
206206

207-
static inline int skel_closenz(int fd)
207+
static inline int skel_closenez(int fd)
208208
{
209-
if (fd > 0)
210-
return close(fd);
211-
return -EINVAL;
209+
if (fd < 0)
210+
return -EINVAL;
211+
return close(fd);
212212
}
213213

214214
#ifndef offsetofend

0 commit comments

Comments
 (0)