mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
signals: dump alternate stack as misc parameters
The initilization stage is not good for that, because it can fail. Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
27582e3272
commit
c2c44d5261
@@ -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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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)
|
|||||||
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
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user