Files
linux/include/linux
Leon Hwang d6083f040d bpf: Prevent tailcall infinite loop caused by freplace
There is a potential infinite loop issue that can occur when using a
combination of tail calls and freplace.

In an upcoming selftest, the attach target for entry_freplace of
tailcall_freplace.c is subprog_tc of tc_bpf2bpf.c, while the tail call in
entry_freplace leads to entry_tc. This results in an infinite loop:

entry_tc -> subprog_tc -> entry_freplace --tailcall-> entry_tc.

The problem arises because the tail_call_cnt in entry_freplace resets to
zero each time entry_freplace is executed, causing the tail call mechanism
to never terminate, eventually leading to a kernel panic.

To fix this issue, the solution is twofold:

1. Prevent updating a program extended by an freplace program to a
   prog_array map.
2. Prevent extending a program that is already part of a prog_array map
   with an freplace program.

This ensures that:

* If a program or its subprogram has been extended by an freplace program,
  it can no longer be updated to a prog_array map.
* If a program has been added to a prog_array map, neither it nor its
  subprograms can be extended by an freplace program.

Moreover, an extension program should not be tailcalled. As such, return
-EINVAL if the program has a type of BPF_PROG_TYPE_EXT when adding it to a
prog_array map.

Additionally, fix a minor code style issue by replacing eight spaces with a
tab for proper formatting.

Reviewed-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Link: https://lore.kernel.org/r/20241015150207.70264-2-leon.hwang@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2024-10-16 09:21:18 -07:00
..
2024-09-01 10:04:56 -04:00
2024-09-09 16:39:18 -07:00
2024-08-29 04:32:32 -06:00
2024-08-28 06:53:58 -07:00
2024-10-14 18:33:04 -07:00
2024-07-08 01:51:05 -06:00
2024-09-03 21:15:36 -07:00
2024-08-02 15:56:38 +02:00
2024-10-01 17:01:40 +02:00
2024-09-27 08:18:43 -07:00
2024-09-09 16:39:05 -07:00
2024-08-29 10:39:37 +02:00
2024-08-23 20:50:19 +02:00
2024-07-31 13:49:48 +01:00
2024-08-08 17:15:02 +02:00
2024-08-27 14:12:51 +02:00
2024-09-03 21:15:46 -07:00
2024-09-20 18:28:26 +03:00
2024-09-01 20:26:03 -07:00
2024-09-09 16:39:04 -07:00
2024-07-10 12:14:54 -07:00
2024-08-11 17:04:29 +01:00
2024-07-31 09:57:18 -07:00
2024-09-03 21:15:44 -07:00
2024-07-28 16:47:51 -06:00
2024-09-23 15:03:30 -04:00
2024-09-23 15:03:30 -04:00
2024-09-23 15:03:30 -04:00
2024-08-30 08:22:38 +02:00
2024-09-19 14:25:32 -05:00
2024-09-19 14:25:34 -05:00
2024-09-01 20:26:04 -07:00
2024-09-17 01:06:59 -07:00
2024-09-05 11:14:14 +02:00
2024-09-11 20:44:31 -07:00
2024-09-11 20:44:32 -07:00
2024-08-12 23:50:58 +05:30
2024-07-10 07:59:03 +02:00
2024-09-22 11:19:35 -07:00
2024-08-06 13:42:40 +02:00
2024-09-12 12:20:39 +02:00
2024-09-09 16:39:04 -07:00
2024-09-01 20:25:43 -07:00