c/r: prctl: Add ability to get clear_tid_address
RFC 1/1 c/r: prctl: Add ability to get clear_tid_address
Hi guys,
there were a converation about ability to retrieve task::clear_tid_address
(https://lkml.org/lkml/2012/2/3/116) via ptrace call, which was found as being a bit inappropriate. So we've switched to prctl interface instead. What do you think? Did I miss something? Comments are welcome
Cyrill
---
Subject: [RFC] c/r: prctl: Add ability to get clear_tid_address
From: Andrew Vagin <[email protected]>
Zero is written at clear_tid_address, when
the process exits. This functionality is used
by pthread_join().
We already have sys_set_tid_address() to change this address for current task but there is no way to obtain it from a user space.
Without ability to find this address and dump it we can't restore pthread'ed apps which do call pthread_join() once they have been restored.
This patch introduces PR_GET_TID_ADDRESS prctl option which allow current process to obtain own clear_tid_address.
This feature is available iif CONFIG_CHECKPOINT_RESTORE is set.
--- include/linux/prctl.h | 2 ++ kernel/sys.c | 13 +++++++++++++ 2 files changed, 15 insertions(+)
include/linux/prctl.h +2 -0
@@ -120,4 +120,6 @@# define PR_SET_MM_AUXV 12# define PR_SET_MM_EXE_FILE 13 +#define PR_GET_TID_ADDRESS 36 +#endif /* _LINUX_PRCTL_H */
kernel/sys.c +13 -0
@@ -1903,12 +1903,22 @@ out:up_read (&mm->mmap_sem);return error; } + +static int prctl_get_tid_address (struct task_struct *me,int __user **tid_addr) +{ +return put_user (me->clear_child_tid, addr); +} +#else /* CONFIG_CHECKPOINT_RESTORE */ static int prctl_set_mm (int opt,unsigned long addr,unsigned long arg4,unsigned long arg5) {return -EINVAL ; } +static int prctl_get_tid_address (struct task_struct *me,int __user **tid_addr) +{ +return -EINVAL ; +}#endif SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
@@ -2063,6 +2073,9 @@ SYSCALL_DEFINE5(prctl, int, option, unsicase PR_SET_MM : error =prctl_set_mm (arg2, arg3, arg4, arg5);break ; +case PR_GET_TID_ADDRESS : + error =prctl_get_tid_address (me, (int __user **)arg2); +break ;default : error = -EINVAL ;break ;
Quoted 7 lines · Cyrill Gorcunov
Hi guys,
there were a converation about ability to retrieve
task::clear_tid_address
(https://lkml.org/lkml/2012/2/3/116) via ptrace call, which was found as being a bit inappropriate. So we've switched to prctl interface instead. What do you think? Did I miss something? Comments are welcome
This patch has a typo, so ignore it please. I'll resend it in another series.