Commit b1f1154c authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

auxv: Use real size of the auxv vector

The size of vector depends on the kernel config
so use the real size of a vector dumped. Otherwise
we might fail on restore.
Reported-by: 's avatarStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 84ed00b6
...@@ -537,7 +537,7 @@ static int dump_task_creds(struct parasite_ctl *ctl, const struct cr_fdset *fds) ...@@ -537,7 +537,7 @@ static int dump_task_creds(struct parasite_ctl *ctl, const struct cr_fdset *fds)
#define assign_reg(dst, src, e) do { dst->e = (__typeof__(dst->e))src.e; } while (0) #define assign_reg(dst, src, e) do { dst->e = (__typeof__(dst->e))src.e; } while (0)
#define assign_array(dst, src, e) memcpy(dst->e, &src.e, sizeof(src.e)) #define assign_array(dst, src, e) memcpy(dst->e, &src.e, sizeof(src.e))
static int get_task_auxv(pid_t pid, MmEntry *mm) static int get_task_auxv(pid_t pid, MmEntry *mm, size_t *size)
{ {
int fd, ret, i; int fd, ret, i;
...@@ -560,6 +560,7 @@ static int get_task_auxv(pid_t pid, MmEntry *mm) ...@@ -560,6 +560,7 @@ static int get_task_auxv(pid_t pid, MmEntry *mm)
} }
} }
*size = i;
ret = 0; ret = 0;
err: err:
close_safe(&fd); close_safe(&fd);
...@@ -591,7 +592,7 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat, ...@@ -591,7 +592,7 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
if (!mme.mm_saved_auxv) if (!mme.mm_saved_auxv)
goto out; goto out;
if (get_task_auxv(pid, &mme)) if (get_task_auxv(pid, &mme, &mme.n_mm_saved_auxv))
goto out; goto out;
pr_info("OK\n"); pr_info("OK\n");
......
...@@ -1208,13 +1208,14 @@ static int prepare_mm(pid_t pid, struct task_restore_core_args *args) ...@@ -1208,13 +1208,14 @@ static int prepare_mm(pid_t pid, struct task_restore_core_args *args)
args->mm.n_mm_saved_auxv = 0; args->mm.n_mm_saved_auxv = 0;
args->mm.mm_saved_auxv = NULL; args->mm.mm_saved_auxv = NULL;
if (mm->n_mm_saved_auxv != AT_VECTOR_SIZE) { if (mm->n_mm_saved_auxv > AT_VECTOR_SIZE) {
pr_err("Image corrupted on pid %d\n", pid); pr_err("Image corrupted on pid %d\n", pid);
goto out; goto out;
} }
args->mm_saved_auxv_size = pb_repeated_size(mm, mm_saved_auxv);
memcpy(args->mm_saved_auxv, mm->mm_saved_auxv, memcpy(args->mm_saved_auxv, mm->mm_saved_auxv,
pb_repeated_size(mm, mm_saved_auxv)); args->mm_saved_auxv_size);
exe_fd = open_reg_by_id(args->mm.exe_file_id); exe_fd = open_reg_by_id(args->mm.exe_file_id);
if (exe_fd < 0) if (exe_fd < 0)
......
...@@ -110,6 +110,7 @@ struct task_restore_core_args { ...@@ -110,6 +110,7 @@ struct task_restore_core_args {
MmEntry mm; MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE]; u64 mm_saved_auxv[AT_VECTOR_SIZE];
u32 mm_saved_auxv_size;
u64 blk_sigset; u64 blk_sigset;
char comm[TASK_COMM_LEN]; char comm[TASK_COMM_LEN];
TaskKobjIdsEntry ids; TaskKobjIdsEntry ids;
......
...@@ -467,8 +467,7 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -467,8 +467,7 @@ long __export_restore_task(struct task_restore_core_args *args)
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ARG_END, (long)args->mm.mm_arg_end, 0); ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ARG_END, (long)args->mm.mm_arg_end, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_START, (long)args->mm.mm_env_start, 0); ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_START, (long)args->mm.mm_env_start, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_END, (long)args->mm.mm_env_end, 0); ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_ENV_END, (long)args->mm.mm_env_end, 0);
ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_AUXV, (long)args->mm_saved_auxv, ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_AUXV, (long)args->mm_saved_auxv, args->mm_saved_auxv_size);
sizeof(args->mm_saved_auxv));
if (ret) if (ret)
goto core_restore_end; goto core_restore_end;
......
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