mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 23:59:33 -04:00
bpf: Reject callback subprogs invoke tailcall
Some JIT compilers, such as x86_64, rely on a register to pass the TCC. When subprograms of synchronous callback invoke tailcall, C helpers invoking bpf callback clobber this register, and the corrupted TCC may bypass the TCC limit, leading to infinite tailcall. Fix this by rejecting tailcall inside all subprogs of sync callback. This also cleanly consolidates the existing async and exception callback checks into a single unified `is_cb` check. Reported-by: Sashiko <sashiko-bot@kernel.org> Reported-by: Björn Töpel <bjorn@kernel.org> Signed-off-by: Pu Lehui <pulehui@huawei.com> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://patch.msgid.link/20260716120157.835937-3-pulehui@huaweicloud.com Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
This commit is contained in:
committed by
Eduard Zingerman
parent
3513ea9dab
commit
a41d0c30d7
@@ -5237,10 +5237,6 @@ static int check_max_stack_depth_subprog(struct bpf_verifier_env *env, int idx,
|
||||
if (verifier_bug_if(sidx < 0, env, "callee not found at insn %d", next_insn))
|
||||
return -EFAULT;
|
||||
if (subprog[sidx].is_async_cb) {
|
||||
if (subprog[sidx].has_tail_call) {
|
||||
verifier_bug(env, "subprog has tail_call and async cb");
|
||||
return -EFAULT;
|
||||
}
|
||||
/* async callbacks don't increase bpf prog stack size unless called directly */
|
||||
if (!bpf_pseudo_call(insn + i))
|
||||
continue;
|
||||
@@ -5281,8 +5277,8 @@ static int check_max_stack_depth_subprog(struct bpf_verifier_env *env, int idx,
|
||||
*/
|
||||
if (tail_call_reachable) {
|
||||
for (tmp = idx; tmp >= 0; tmp = dinfo[tmp].caller) {
|
||||
if (subprog[tmp].is_exception_cb) {
|
||||
verbose(env, "cannot tail call within exception cb\n");
|
||||
if (subprog[tmp].is_cb) {
|
||||
verbose(env, "cannot tail call within callback\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (subprog[tmp].stack_arg_cnt) {
|
||||
|
||||
Reference in New Issue
Block a user