diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig index 18f636e6d30e314215fe5fa1907df5d825093b94..19fd0a23bbbb939771ddf6ed879196d0eda3fa0c 100644 --- a/drivers/android/Kconfig +++ b/drivers/android/Kconfig @@ -61,6 +61,11 @@ config BINDER_TRANSACTION_PROC_BRIEF help Enable binder optimization + +config BINDER_SENDER_INFO + bool "Get binder sender info" + default y + endif # if ANDROID endmenu diff --git a/drivers/android/binder.c b/drivers/android/binder.c index fb8629506eeab82b1cfd055b5cb2f0dc3b47ae55..5a5829950acd8fcb3bc3b4d374ef878ee2000046 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -568,9 +568,12 @@ struct binder_thread { struct binder_stats stats; atomic_t tmp_ref; bool is_dead; +#ifdef CONFIG_BINDER_SENDER_INFO #ifdef CONFIG_ACCESS_TOKENID struct access_token tokens; #endif /* CONFIG_ACCESS_TOKENID */ + __u64 sender_pid_nr; +#endif }; /** @@ -621,10 +624,10 @@ struct binder_transaction { * during thread teardown */ spinlock_t lock; -#ifdef CONFIG_ACCESS_TOKENID +#if defined(CONFIG_BINDER_SENDER_INFO) && defined(CONFIG_ACCESS_TOKENID) u64 sender_tokenid; u64 first_tokenid; -#endif /* CONFIG_ACCESS_TOKENID */ +#endif }; /** @@ -3437,10 +3440,10 @@ static void binder_transaction(struct binder_proc *proc, #endif } t->sender_euid = task_euid(proc->tsk); -#ifdef CONFIG_ACCESS_TOKENID +#if defined(CONFIG_BINDER_SENDER_INFO) && defined(CONFIG_ACCESS_TOKENID) t->sender_tokenid = current->token; t->first_tokenid = current->ftoken; -#endif /* CONFIG_ACCESS_TOKENID */ +#endif t->to_proc = target_proc; t->to_thread = target_thread; t->code = tr->code; @@ -4876,8 +4879,18 @@ static int binder_thread_read(struct binder_proc *proc, trd->sender_pid = task_tgid_nr_ns(sender, task_active_pid_ns(current)); +#ifdef CONFIG_BINDER_SENDER_INFO + binder_inner_proc_lock(thread->proc); + thread->sender_pid_nr = task_tgid_nr(sender); + binder_inner_proc_unlock(thread->proc); +#endif } else { trd->sender_pid = 0; +#ifdef CONFIG_BINDER_SENDER_INFO + binder_inner_proc_lock(thread->proc); + thread->sender_pid_nr = 0; + binder_inner_proc_unlock(thread->proc); +#endif } ret = binder_apply_fd_fixups(proc, t); @@ -4958,12 +4971,12 @@ static int binder_thread_read(struct binder_proc *proc, if (t_from) binder_thread_dec_tmpref(t_from); t->buffer->allow_user_free = 1; -#ifdef CONFIG_ACCESS_TOKENID +#if defined(CONFIG_BINDER_SENDER_INFO) && defined(CONFIG_ACCESS_TOKENID) binder_inner_proc_lock(thread->proc); thread->tokens.sender_tokenid = t->sender_tokenid; thread->tokens.first_tokenid = t->first_tokenid; binder_inner_proc_unlock(thread->proc); -#endif /* CONFIG_ACCESS_TOKENID */ +#endif if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) { binder_inner_proc_lock(thread->proc); t->to_parent = thread->transaction_stack; @@ -5567,30 +5580,38 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; } -#ifdef CONFIG_ACCESS_TOKENID - case BINDER_GET_ACCESS_TOKEN: { - struct access_token __user *tokens = ubuf; - u64 token, ftoken; +#ifdef CONFIG_BINDER_SENDER_INFO + case BINDER_GET_SENDER_INFO: { + struct binder_sender_info __user *sender = ubuf; - if (size != sizeof(struct access_token)) { + if (size != sizeof(struct binder_sender_info)) { ret = -EINVAL; goto err; } binder_inner_proc_lock(proc); - token = thread->tokens.sender_tokenid; - ftoken = thread->tokens.first_tokenid; +#ifdef CONFIG_ACCESS_TOKENID + u64 token = thread->tokens.sender_tokenid; + u64 ftoken = thread->tokens.first_tokenid; +#endif + u64 sender_pid_nr = thread->sender_pid_nr; binder_inner_proc_unlock(proc); - if (put_user(token, &tokens->sender_tokenid)) { +#ifdef CONFIG_ACCESS_TOKENID + if (put_user(token, &sender->tokens.sender_tokenid)) { + ret = -EINVAL; + goto err; + } + if (put_user(ftoken, &sender->tokens.first_tokenid)) { ret = -EINVAL; goto err; } - if (put_user(ftoken, &tokens->first_tokenid)) { +#endif + if (put_user(sender_pid_nr, &sender->sender_pid_nr)) { ret = -EINVAL; goto err; } break; } -#endif /* CONFIG_ACCESS_TOKENID */ +#endif /* CONFIG_BINDER_SENDER_INFO */ default: ret = -EINVAL; goto err; diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h index 3abb5b15aa716d5a26770a036bc3b1dab5de23dd..3b1bd4584e7a2f899fbcbe8cea3682aa8611075a 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -227,6 +227,11 @@ struct access_token { __u64 reserved[2]; }; +struct binder_sender_info { + struct access_token tokens; + __u64 sender_pid_nr; +}; + #define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read) #define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, __s64) #define BINDER_SET_MAX_THREADS _IOW('b', 5, __u32) @@ -239,7 +244,7 @@ struct access_token { #define BINDER_SET_CONTEXT_MGR_EXT _IOW('b', 13, struct flat_binder_object) #define BINDER_FEATURE_SET _IOWR('b', 30, struct binder_feature_set) -#define BINDER_GET_ACCESS_TOKEN _IOWR('b', 31, struct access_token) +#define BINDER_GET_SENDER_INFO _IOWR('b', 31, struct binder_sender_info) /* * NOTE: Two special error codes you should check for when calling