Commit 3e235f71 authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Get self maps after allocating necessary memory

We're filling some rst-mem data _after_ we get the self maps
list. This is a bug, since the restorer vma get forcedly mapped
into a place we get out of self-vmas-list.

Move the self-vmas-list getting after we allocate the memory
we need.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 95a961b7
...@@ -2158,11 +2158,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2158,11 +2158,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
pr_info("Restore via sigreturn\n"); pr_info("Restore via sigreturn\n");
ret = parse_smaps(pid, &self_vmas, false);
close_proc();
if (ret < 0)
goto err;
rst_mem_switch_to_private(); rst_mem_switch_to_private();
/* pr_info_vma_list(&self_vma_list); */ /* pr_info_vma_list(&self_vma_list); */
...@@ -2184,43 +2179,54 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2184,43 +2179,54 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
vme = rst_mem_alloc(sizeof(*vme), RM_PRIVATE); vme = rst_mem_alloc(sizeof(*vme), RM_PRIVATE);
if (!vme) if (!vme)
goto err; goto err_nv;
*vme = vma->vma; *vme = vma->vma;
} }
siginfo_priv_nr = xmalloc(sizeof(int) * current->nr_threads); siginfo_priv_nr = xmalloc(sizeof(int) * current->nr_threads);
if (siginfo_priv_nr == NULL) if (siginfo_priv_nr == NULL)
goto err; goto err_nv;
ret = open_signal_image(CR_FD_SIGNAL, pid, &siginfo_chunk, &siginfo_nr); ret = open_signal_image(CR_FD_SIGNAL, pid, &siginfo_chunk, &siginfo_nr);
if (ret < 0) if (ret < 0)
goto err; goto err_nv;
for (i = 0; i < current->nr_threads; i++) { for (i = 0; i < current->nr_threads; i++) {
ret = open_signal_image(CR_FD_PSIGNAL, ret = open_signal_image(CR_FD_PSIGNAL,
current->threads[i].virt, NULL, &siginfo_priv_nr[i]); current->threads[i].virt, NULL, &siginfo_priv_nr[i]);
if (ret < 0) if (ret < 0)
goto err; goto err_nv;
} }
ret = open_posix_timers_image(pid, &posix_timers_info_chunk, &posix_timers_nr); ret = open_posix_timers_image(pid, &posix_timers_info_chunk, &posix_timers_nr);
if (ret < 0) if (ret < 0)
goto err; goto err_nv;
tcp_socks = rst_mem_cpos(RM_PRIVATE); tcp_socks = rst_mem_cpos(RM_PRIVATE);
tcp_socks_mem = rst_mem_alloc(rst_tcp_socks_len(), RM_PRIVATE); tcp_socks_mem = rst_mem_alloc(rst_tcp_socks_len(), RM_PRIVATE);
if (!tcp_socks_mem) if (!tcp_socks_mem)
goto err; goto err_nv;
memcpy(tcp_socks_mem, rst_tcp_socks, rst_tcp_socks_len()); memcpy(tcp_socks_mem, rst_tcp_socks, rst_tcp_socks_len());
nr_rlim = prepare_rlimits(pid, &rlimits_rst_addr); nr_rlim = prepare_rlimits(pid, &rlimits_rst_addr);
if (nr_rlim < 0) { if (nr_rlim < 0) {
pr_err("Failed preparing rlimits for pid %d\n", pid); pr_err("Failed preparing rlimits for pid %d\n", pid);
goto err; goto err_nv;
} }
/*
* We're about to search for free VM area and inject the restorer blob
* into it. No irrelevent mmaps/mremaps beyond this point, otherwise
* this unwanted mapping might get overlapped by the restorer.
*/
ret = parse_smaps(pid, &self_vmas, false);
close_proc();
if (ret < 0)
goto err;
restore_bootstrap_len = restorer_len + restore_bootstrap_len = restorer_len +
restore_task_vma_len + restore_task_vma_len +
restore_thread_vma_len + restore_thread_vma_len +
...@@ -2498,7 +2504,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2498,7 +2504,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
err: err:
free_mappings(&self_vmas); free_mappings(&self_vmas);
err_nv:
/* Just to be sure */ /* Just to be sure */
exit(1); exit(1);
return -1; return -1;
......
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