Commit c2c44d52 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

signals: dump alternate stack as misc parameters

The initilization stage is not good for that, because it can fail.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 27582e32
...@@ -668,6 +668,9 @@ static int dump_task_core_all(struct parasite_ctl *ctl, ...@@ -668,6 +668,9 @@ static int dump_task_core_all(struct parasite_ctl *ctl,
core_put_tls(core, misc->tls); core_put_tls(core, misc->tls);
CORE_THREAD_ARCH_INFO(core)->clear_tid_addr = encode_pointer(misc->tid_addr); CORE_THREAD_ARCH_INFO(core)->clear_tid_addr = encode_pointer(misc->tid_addr);
BUG_ON(!core->thread_core->sas);
copy_sas(core->thread_core->sas, &misc->sas);
ret = pb_write_one(fd_core, core, PB_CORE); ret = pb_write_one(fd_core, core, PB_CORE);
if (ret < 0) if (ret < 0)
goto err; goto err;
......
...@@ -71,7 +71,6 @@ struct parasite_init_args { ...@@ -71,7 +71,6 @@ struct parasite_init_args {
k_rtsigset_t sig_blocked; k_rtsigset_t sig_blocked;
struct rt_sigframe *sigframe; struct rt_sigframe *sigframe;
stack_t sas;
}; };
struct parasite_log_args { struct parasite_log_args {
...@@ -150,6 +149,8 @@ struct parasite_dump_misc { ...@@ -150,6 +149,8 @@ struct parasite_dump_misc {
u32 pgid; u32 pgid;
u32 tls; u32 tls;
u32 umask; u32 umask;
stack_t sas;
}; };
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned)) #define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned))
...@@ -168,6 +169,13 @@ struct parasite_dump_thread { ...@@ -168,6 +169,13 @@ struct parasite_dump_thread {
stack_t sas; stack_t sas;
}; };
static inline void copy_sas(ThreadSasEntry *dst, const stack_t *src)
{
dst->ss_sp = encode_pointer(src->ss_sp);
dst->ss_size = (u64)src->ss_size;
dst->ss_flags = src->ss_flags;
}
#define PARASITE_MAX_FDS (PAGE_SIZE / sizeof(int)) #define PARASITE_MAX_FDS (PAGE_SIZE / sizeof(int))
struct parasite_drain_fd { struct parasite_drain_fd {
......
...@@ -370,13 +370,6 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid) ...@@ -370,13 +370,6 @@ static int parasite_set_logfd(struct parasite_ctl *ctl, pid_t pid)
return 0; return 0;
} }
static void copy_sas(ThreadSasEntry *dst, stack_t *src)
{
dst->ss_sp = encode_pointer(src->ss_sp);
dst->ss_size = (u64)src->ss_size;
dst->ss_flags = src->ss_flags;
}
static int parasite_init(struct parasite_ctl *ctl, pid_t pid, struct pstree_item *item) static int parasite_init(struct parasite_ctl *ctl, pid_t pid, struct pstree_item *item)
{ {
static int ssock = -1; static int ssock = -1;
...@@ -428,9 +421,6 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, struct pstree_item ...@@ -428,9 +421,6 @@ static int parasite_init(struct parasite_ctl *ctl, pid_t pid, struct pstree_item
ctl->sig_blocked = args->sig_blocked; ctl->sig_blocked = args->sig_blocked;
ctl->use_sig_blocked = true; ctl->use_sig_blocked = true;
BUG_ON(!item->core[0]->thread_core->sas);
copy_sas(item->core[0]->thread_core->sas, &args->sas);
sock = accept(ssock, NULL, 0); sock = accept(ssock, NULL, 0);
if (sock < 0) { if (sock < 0) {
pr_perror("Can't accept connection to the transport socket"); pr_perror("Can't accept connection to the transport socket");
......
...@@ -149,6 +149,10 @@ static int dump_misc(struct parasite_dump_misc *args) ...@@ -149,6 +149,10 @@ static int dump_misc(struct parasite_dump_misc *args)
args->umask = sys_umask(0); args->umask = sys_umask(0);
sys_umask(args->umask); /* never fails */ sys_umask(args->umask); /* never fails */
ret = sys_sigaltstack(NULL, &args->sas);
if (ret)
return ret;
ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &args->tid_addr, 0, 0, 0); ret = sys_prctl(PR_GET_TID_ADDRESS, (unsigned long) &args->tid_addr, 0, 0, 0);
return ret; return ret;
...@@ -250,10 +254,6 @@ static int init(struct parasite_init_args *args) ...@@ -250,10 +254,6 @@ static int init(struct parasite_init_args *args)
if (ret) if (ret)
return -1; return -1;
ret = sys_sigaltstack(NULL, &args->sas);
if (ret)
goto err;
tsock = sys_socket(PF_UNIX, SOCK_STREAM, 0); tsock = sys_socket(PF_UNIX, SOCK_STREAM, 0);
if (tsock < 0) { if (tsock < 0) {
ret = tsock; ret = tsock;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment