mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-28 12:57:57 +00:00
dump: preserve the dumpable flag on criu dump/restore
Preserve the dumpable flag, which affects whether a core dump will be generated, but also affects the ownership of the virtual files under /proc/$pid after restoring a process. Tested: Restored a process with a criu including this patch and looked at /proc/$pid to confirm that the virtual files were no longer all owned by root:root. zdtm tests pass except for cow01 which seems to be broken. (see https://bugzilla.openvz.org/show_bug.cgi?id=2967 for details.) This patch fixes https://bugzilla.openvz.org/show_bug.cgi?id=2968 Signed-off-by: Filipe Brandenburger <filbranden@google.com> Change-Id: I8c386508448a84368a86666f2d7500b252a78bbf Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
parent
1a1b50168d
commit
d5bb7e9748
@ -471,6 +471,9 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
|
|||||||
|
|
||||||
mme.mm_brk = misc->brk;
|
mme.mm_brk = misc->brk;
|
||||||
|
|
||||||
|
mme.dumpable = misc->dumpable;
|
||||||
|
mme.has_dumpable = true;
|
||||||
|
|
||||||
mme.n_mm_saved_auxv = AT_VECTOR_SIZE;
|
mme.n_mm_saved_auxv = AT_VECTOR_SIZE;
|
||||||
mme.mm_saved_auxv = xmalloc(pb_repeated_size(&mme, mm_saved_auxv));
|
mme.mm_saved_auxv = xmalloc(pb_repeated_size(&mme, mm_saved_auxv));
|
||||||
if (!mme.mm_saved_auxv)
|
if (!mme.mm_saved_auxv)
|
||||||
|
@ -156,6 +156,8 @@ struct parasite_dump_misc {
|
|||||||
u32 umask;
|
u32 umask;
|
||||||
|
|
||||||
struct parasite_dump_thread ti;
|
struct parasite_dump_thread ti;
|
||||||
|
|
||||||
|
int dumpable;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned))
|
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned))
|
||||||
|
@ -16,6 +16,12 @@
|
|||||||
#ifndef PR_SET_SECUREBITS
|
#ifndef PR_SET_SECUREBITS
|
||||||
# define PR_SET_SECUREBITS 28
|
# define PR_SET_SECUREBITS 28
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef PR_GET_DUMPABLE
|
||||||
|
# define PR_GET_DUMPABLE 3
|
||||||
|
#endif
|
||||||
|
#ifndef PR_SET_DUMPABLE
|
||||||
|
# define PR_SET_DUMPABLE 4
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef PR_SET_MM
|
#ifndef PR_SET_MM
|
||||||
#define PR_SET_MM 35
|
#define PR_SET_MM 35
|
||||||
|
@ -159,6 +159,7 @@ static int dump_misc(struct parasite_dump_misc *args)
|
|||||||
args->pgid = sys_getpgid(0);
|
args->pgid = sys_getpgid(0);
|
||||||
args->umask = sys_umask(0);
|
args->umask = sys_umask(0);
|
||||||
sys_umask(args->umask); /* never fails */
|
sys_umask(args->umask); /* never fails */
|
||||||
|
args->dumpable = sys_prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
|
||||||
|
|
||||||
return dump_thread_common(&args->ti);
|
return dump_thread_common(&args->ti);
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "restorer.h"
|
#include "restorer.h"
|
||||||
|
|
||||||
#include "protobuf/creds.pb-c.h"
|
#include "protobuf/creds.pb-c.h"
|
||||||
|
#include "protobuf/mm.pb-c.h"
|
||||||
|
|
||||||
#include "asm/restorer.h"
|
#include "asm/restorer.h"
|
||||||
|
|
||||||
@ -187,6 +188,21 @@ static int restore_creds(CredsEntry *ce)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int restore_dumpable_flag(MmEntry *mme)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (mme->has_dumpable) {
|
||||||
|
ret = sys_prctl(PR_SET_DUMPABLE, mme->dumpable, 0, 0, 0);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("Unable to set PR_SET_DUMPABLE: %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void restore_sched_info(struct rst_sched_param *p)
|
static void restore_sched_info(struct rst_sched_param *p)
|
||||||
{
|
{
|
||||||
struct sched_param parm;
|
struct sched_param parm;
|
||||||
@ -295,6 +311,10 @@ long __export_restore_thread(struct thread_restore_args *args)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto core_restore_end;
|
goto core_restore_end;
|
||||||
|
|
||||||
|
ret = restore_dumpable_flag(&args->ta->mm);
|
||||||
|
if (ret)
|
||||||
|
goto core_restore_end;
|
||||||
|
|
||||||
pr_info("%ld: Restored\n", sys_gettid());
|
pr_info("%ld: Restored\n", sys_gettid());
|
||||||
|
|
||||||
restore_finish_stage(CR_STATE_RESTORE);
|
restore_finish_stage(CR_STATE_RESTORE);
|
||||||
@ -918,6 +938,7 @@ long __export_restore_task(struct task_restore_args *args)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ret = restore_creds(&args->creds);
|
ret = restore_creds(&args->creds);
|
||||||
|
ret = ret || restore_dumpable_flag(&args->mm);
|
||||||
|
|
||||||
futex_set_and_wake(&thread_inprogress, args->nr_threads);
|
futex_set_and_wake(&thread_inprogress, args->nr_threads);
|
||||||
|
|
||||||
|
@ -17,4 +17,6 @@ message mm_entry {
|
|||||||
repeated uint64 mm_saved_auxv = 13;
|
repeated uint64 mm_saved_auxv = 13;
|
||||||
|
|
||||||
repeated vma_entry vmas = 14;
|
repeated vma_entry vmas = 14;
|
||||||
|
|
||||||
|
optional int32 dumpable = 15;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user