Thanks Jann, the change LGTM, one question on the repro scenario that wasn't immediately obvious to me: On Mon, Jul 27, 2020 at 2:04 PM Jann Horn <jannh@xxxxxxxxxx> wrote: > - task B opens /dev/binder once, creating binder_proc instance P3 > - P3 calls P2 (via magic handle 0) with (void*)1 as argument (two-way > transaction) > - P2 receives the handle and uses it to call P3 (two-way transaction) > - P3 calls P2 (via magic handle 0) (two-way transaction) > - P2 calls P2 (via handle 1) (two-way transaction) Why do you need P3 involved at all? Could P2 just straight away make a call on handle 1? > > And then, if P2 does *NOT* accept the incoming transaction work, but > instead closes the binder fd, we get a crash. > > Solve it by preventing the context manager from using ACQUIRE on ref 0. > There shouldn't be any legitimate reason for the context manager to do > that. > > Additionally, print a warning if someone manages to find another way to > trigger a transaction-to-self bug in the future. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 457b9a6f09f0 ("Staging: android: add binder driver") > Acked-by: Todd Kjos <tkjos@xxxxxxxxxx> Reviewed-by: Martijn Coenen <maco@xxxxxxxxxxx> > Signed-off-by: Jann Horn <jannh@xxxxxxxxxx> > --- > fixed that broken binder_user_error() from the first version... > I sent v1 while I had a dirty tree containing the missing fix. whoops. > > drivers/android/binder.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c > index f50c5f182bb5..5b310eea9e52 100644 > --- a/drivers/android/binder.c > +++ b/drivers/android/binder.c > @@ -2982,6 +2982,12 @@ static void binder_transaction(struct binder_proc *proc, > goto err_dead_binder; > } > e->to_node = target_node->debug_id; > + if (WARN_ON(proc == target_proc)) { > + return_error = BR_FAILED_REPLY; > + return_error_param = -EINVAL; > + return_error_line = __LINE__; > + goto err_invalid_target_handle; > + } > if (security_binder_transaction(proc->tsk, > target_proc->tsk) < 0) { > return_error = BR_FAILED_REPLY; > @@ -3635,10 +3641,17 @@ static int binder_thread_write(struct binder_proc *proc, > struct binder_node *ctx_mgr_node; > mutex_lock(&context->context_mgr_node_lock); > ctx_mgr_node = context->binder_context_mgr_node; > - if (ctx_mgr_node) > + if (ctx_mgr_node) { > + if (ctx_mgr_node->proc == proc) { > + binder_user_error("%d:%d context manager tried to acquire desc 0\n", > + proc->pid, thread->pid); > + mutex_unlock(&context->context_mgr_node_lock); > + return -EINVAL; > + } > ret = binder_inc_ref_for_node( > proc, ctx_mgr_node, > strong, NULL, &rdata); > + } > mutex_unlock(&context->context_mgr_node_lock); > } > if (ret) > > base-commit: 2a89b99f580371b86ae9bafd6cbeccd3bfab524a > -- > 2.28.0.rc0.142.g3c755180ce-goog > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel