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..a4a0950b2a7cedf7254770554f3460d77a5a3855 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -110,8 +110,16 @@ DEFINE_PROC_SHOW_ATTRIBUTE(binder_transaction_proc); #define ENABLE_ACCESS_TOKENID 0 #endif /* CONFIG_ACCESS_TOKENID */ +#ifdef CONFIG_BINDER_SENDER_INFO +#define ENABLE_BINDER_SENDER_INFO 1 +#else +#define ENABLE_BINDER_SENDER_INFO 0 +#endif /* CONFIG_BINDER_SENDER_INFO */ + #define ACCESS_TOKENID_FEATURE_VALUE (ENABLE_ACCESS_TOKENID << 0) -#define BINDER_CURRENT_FEATURE_SET ACCESS_TOKENID_FEATURE_VALUE +#define BINDER_SENDER_INFO_FEATURE_VALUE (ENABLE_BINDER_SENDER_INFO << 2) + +#define BINDER_CURRENT_FEATURE_SET (ACCESS_TOKENID_FEATURE_VALUE | BINDER_SENDER_INFO_FEATURE_VALUE) enum { BINDER_DEBUG_USER_ERROR = 1U << 0, @@ -571,6 +579,9 @@ struct binder_thread { #ifdef CONFIG_ACCESS_TOKENID struct access_token tokens; #endif /* CONFIG_ACCESS_TOKENID */ +#ifdef CONFIG_BINDER_SENDER_INFO + __u64 sender_pid_nr; +#endif /* CONFIG_BINDER_SENDER_INFO */ }; /** @@ -4876,8 +4887,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); @@ -5591,6 +5612,39 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) break; } #endif /* CONFIG_ACCESS_TOKENID */ + +#ifdef CONFIG_BINDER_SENDER_INFO + case BINDER_GET_SENDER_INFO: { + struct binder_sender_info __user *sender = ubuf; + u64 token, ftoken, sender_pid_nr; + if (size != sizeof(struct binder_sender_info)) { + ret = -EINVAL; + goto err; + } + binder_inner_proc_lock(proc); +#ifdef CONFIG_ACCESS_TOKENID + token = thread->tokens.sender_tokenid; + ftoken = thread->tokens.first_tokenid; +#endif /*CONFIG_ACCESS_TOKENID*/ + sender_pid_nr = thread->sender_pid_nr; + binder_inner_proc_unlock(proc); +#ifdef CONFIG_ACCESS_TOKENID + if (put_user(token, &sender->tokens.sender_tokenid)) { + ret = -EFAULT; + goto err; + } + if (put_user(ftoken, &sender->tokens.first_tokenid)) { + ret = -EFAULT; + goto err; + } +#endif /*CONFIG_ACCESS_TOKENID*/ + if (put_user(sender_pid_nr, &sender->sender_pid_nr)) { + ret = -EFAULT; + goto err; + } + break; + } +#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..2953868671279c2e5b71e7089cfb584ffe69214c 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) @@ -240,6 +245,7 @@ struct access_token { #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', 32, struct binder_sender_info) /* * NOTE: Two special error codes you should check for when calling