[CRIU] [PATCH] rst: Sanitize standard arrays remapping
Pavel Emelyanov
xemul at parallels.com
Fri Jun 5 09:13:27 PDT 2015
On restore we have several arrays of objects that get remapped
into pie area and their number is also passed. Clean and shorten
the remapping code a bit and bing their naming to common format.
Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
cr-restore.c | 45 +++++++++++++++++----------------------------
include/restorer.h | 50 ++++++++++++++++++++++++++++----------------------
pie/restorer.c | 48 ++++++++++++++++++++++++------------------------
3 files changed, 69 insertions(+), 74 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index aa00dc2..2db4fc5 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -2855,29 +2855,21 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr;
task_args->premmapped_len = rsti(current)->premmapped_len;
- task_args->nr_vmas = vmas->nr;
- task_args->tgt_vmas = rst_mem_remap_ptr(tgt_vmas, RM_PRIVATE);
-
- task_args->timer_n = posix_timers_nr;
- task_args->posix_timers = rst_mem_remap_ptr(posix_timers_cpos, RM_PRIVATE);
-
- task_args->timerfd_n = rst_timerfd_nr;
- task_args->timerfd = rst_mem_remap_ptr(timerfd_mem_cpos, RM_PRIVATE);
-
- task_args->siginfo_nr = siginfo_nr;
- task_args->siginfo = rst_mem_remap_ptr(siginfo_cpos, RM_PRIVATE);
-
- task_args->tcp_socks_nr = rst_tcp_socks_nr;
- task_args->tcp_socks = rst_mem_remap_ptr(tcp_socks, RM_PRIVATE);
-
- task_args->nr_rings = mm->n_aios;
- task_args->rings = rst_mem_remap_ptr(aio_rings, RM_PRIVATE);
-
- task_args->n_helpers = n_helpers;
- if (n_helpers > 0)
- task_args->helpers = rst_mem_remap_ptr(helpers_pos, RM_PRIVATE);
- else
- task_args->helpers = NULL;
+#define remap_array(name, nr, cpos) do { \
+ task_args->name##_n = nr; \
+ task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \
+ } while (0)
+
+ remap_array(vmas, vmas->nr, tgt_vmas);
+ remap_array(posix_timers, posix_timers_nr, posix_timers_cpos);
+ remap_array(timerfd, rst_timerfd_nr, timerfd_mem_cpos);
+ remap_array(siginfo, siginfo_nr, siginfo_cpos);
+ remap_array(tcp_socks, rst_tcp_socks_nr, tcp_socks);
+ remap_array(rings, mm->n_aios, aio_rings);
+ remap_array(rlims, rlims_nr, rlims_cpos);
+ remap_array(helpers, n_helpers, helpers_pos);
+
+#undef remap_array
if (lsm) {
task_args->proc_attr_current = open_proc_rw(PROC_SELF, "attr/current");
@@ -2904,9 +2896,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm));
- task_args->nr_rlim = rlims_nr;
- if (rlims_nr)
- task_args->rlims = rst_mem_remap_ptr(rlims_cpos, RM_PRIVATE);
/*
* Fill up per-thread data.
@@ -2916,10 +2905,10 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
struct rt_sigframe *sigframe;
thread_args[i].pid = current->threads[i].virt;
- thread_args[i].siginfo_nr = siginfo_priv_nr[i];
+ thread_args[i].siginfo_n = siginfo_priv_nr[i];
thread_args[i].siginfo = rst_mem_remap_ptr(siginfo_cpos, RM_PRIVATE);
thread_args[i].siginfo += siginfo_nr;
- siginfo_nr += thread_args[i].siginfo_nr;
+ siginfo_nr += thread_args[i].siginfo_n;
/* skip self */
if (thread_args[i].pid == pid) {
diff --git a/include/restorer.h b/include/restorer.h
index 34396e3..54f4166 100644
--- a/include/restorer.h
+++ b/include/restorer.h
@@ -90,7 +90,8 @@ struct thread_restore_args {
tls_t tls;
siginfo_t *siginfo;
- unsigned int siginfo_nr;
+ unsigned int siginfo_n;
+
int pdeath_sig;
} __aligned(64);
@@ -109,10 +110,33 @@ struct task_restore_args {
struct task_entries *task_entries;
void *rst_mem;
unsigned long rst_mem_size;
- VmaEntry *tgt_vmas;
+
+ /* Below arrays get remapped from RM_PRIVATE in sigreturn_restore */
+ VmaEntry *vmas;
+ unsigned int vmas_n;
+
+ struct restore_posix_timer *posix_timers;
+ unsigned int posix_timers_n;
+
+ struct restore_timerfd *timerfd;
+ unsigned int timerfd_n;
+
siginfo_t *siginfo;
- unsigned int siginfo_nr;
- unsigned int nr_vmas;
+ unsigned int siginfo_n;
+
+ struct rst_tcp_sock *tcp_socks;
+ unsigned int tcp_socks_n;
+
+ struct rst_aio_ring *rings;
+ unsigned int rings_n;
+
+ struct rlimit *rlims;
+ unsigned int rlims_n;
+
+ pid_t *helpers /* the TASK_HELPERS to wait on at the end of restore */;
+ unsigned int helpers_n;
+ /* * * * * * * * * * * * * * * * * * * * */
+
unsigned long premmapped_addr;
unsigned long premmapped_len;
rt_sigaction_t sigchld_act;
@@ -122,12 +146,6 @@ struct task_restore_args {
struct itimerval itimers[3];
- int timer_n;
- struct restore_posix_timer *posix_timers;
-
- int timerfd_n;
- struct restore_timerfd *timerfd;
-
CredsEntry creds;
u32 cap_inh[CR_CAP_SIZE];
u32 cap_prm[CR_CAP_SIZE];
@@ -140,20 +158,8 @@ struct task_restore_args {
u32 mm_saved_auxv_size;
char comm[TASK_COMM_LEN];
- int nr_rlim;
- struct rlimit *rlims;
-
- struct rst_tcp_sock *tcp_socks;
- int tcp_socks_nr;
-
- struct rst_aio_ring *rings;
- int nr_rings;
-
int fd_last_pid; /* sys.ns_last_pid for threads rst */
- pid_t *helpers /* the TASK_HELPERS to wait on at the end of restore */;
- int n_helpers;
-
int proc_attr_current;
char *lsm_profile;
int lsm_profile_len;
diff --git a/pie/restorer.c b/pie/restorer.c
index 8713c6a..893928b 100644
--- a/pie/restorer.c
+++ b/pie/restorer.c
@@ -273,7 +273,7 @@ static void restore_rlims(struct task_restore_args *ta)
{
int r;
- for (r = 0; r < ta->nr_rlim; r++) {
+ for (r = 0; r < ta->rlims_n; r++) {
struct krlimit krlim;
krlim.rlim_cur = ta->rlims[r].rlim_cur;
@@ -378,7 +378,7 @@ long __export_restore_thread(struct thread_restore_args *args)
restore_finish_stage(CR_STATE_RESTORE);
- if (restore_signals(args->siginfo, args->siginfo_nr, false))
+ if (restore_signals(args->siginfo, args->siginfo_n, false))
goto core_restore_end;
restore_finish_stage(CR_STATE_RESTORE_SIGCHLD);
@@ -469,7 +469,7 @@ static void rst_tcp_socks_all(struct task_restore_args *ta)
{
int i;
- for (i = 0; i < ta->tcp_socks_nr; i++)
+ for (i = 0; i < ta->tcp_socks_n; i++)
rst_tcp_repair_off(&ta->tcp_socks[i]);
}
@@ -599,7 +599,7 @@ static int create_posix_timers(struct task_restore_args *args)
timer_t next_id;
struct sigevent sev;
- for (i = 0; i < args->timer_n; i++) {
+ for (i = 0; i < args->posix_timers_n; i++) {
sev.sigev_notify = args->posix_timers[i].spt.it_sigev_notify;
sev.sigev_signo = args->posix_timers[i].spt.si_signo;
sev.sigev_value.sival_ptr = args->posix_timers[i].spt.sival_ptr;
@@ -635,7 +635,7 @@ static void restore_posix_timers(struct task_restore_args *args)
int i;
struct restore_posix_timer *rt;
- for (i = 0; i < args->timer_n; i++) {
+ for (i = 0; i < args->posix_timers_n; i++) {
rt = &args->posix_timers[i];
sys_timer_settime((timer_t)rt->spt.it_id, 0, &rt->val, NULL);
}
@@ -721,7 +721,7 @@ static int wait_helpers(struct task_restore_args *task_args)
{
int i;
- for (i = 0; i < task_args->n_helpers; i++) {
+ for (i = 0; i < task_args->helpers_n; i++) {
int status;
pid_t pid = task_args->helpers[i];
@@ -789,7 +789,7 @@ long __export_restore_task(struct task_restore_args *args)
task_entries = args->task_entries;
helpers = args->helpers;
- n_helpers = args->n_helpers;
+ n_helpers = args->helpers_n;
*args->breakpoint = rst_sigreturn;
ksigfillset(&act.rt_sa_mask);
@@ -815,8 +815,8 @@ long __export_restore_task(struct task_restore_args *args)
goto core_restore_end;
/* Shift private vma-s to the left */
- for (i = 0; i < args->nr_vmas; i++) {
- vma_entry = args->tgt_vmas + i;
+ for (i = 0; i < args->vmas_n; i++) {
+ vma_entry = args->vmas + i;
if (!vma_entry_is_private(vma_entry))
continue;
@@ -833,8 +833,8 @@ long __export_restore_task(struct task_restore_args *args)
}
/* Shift private vma-s to the right */
- for (i = args->nr_vmas - 1; i >= 0; i--) {
- vma_entry = args->tgt_vmas + i;
+ for (i = args->vmas_n - 1; i >= 0; i--) {
+ vma_entry = args->vmas + i;
if (!vma_entry_is_private(vma_entry))
continue;
@@ -853,8 +853,8 @@ long __export_restore_task(struct task_restore_args *args)
/*
* OK, lets try to map new one.
*/
- for (i = 0; i < args->nr_vmas; i++) {
- vma_entry = args->tgt_vmas + i;
+ for (i = 0; i < args->vmas_n; i++) {
+ vma_entry = args->vmas + i;
if (!vma_entry_is(vma_entry, VMA_AREA_REGULAR))
continue;
@@ -874,12 +874,12 @@ long __export_restore_task(struct task_restore_args *args)
/*
* Proxify vDSO.
*/
- for (i = 0; i < args->nr_vmas; i++) {
- if (vma_entry_is(&args->tgt_vmas[i], VMA_AREA_VDSO) ||
- vma_entry_is(&args->tgt_vmas[i], VMA_AREA_VVAR)) {
+ for (i = 0; i < args->vmas_n; i++) {
+ if (vma_entry_is(&args->vmas[i], VMA_AREA_VDSO) ||
+ vma_entry_is(&args->vmas[i], VMA_AREA_VVAR)) {
if (vdso_proxify("dumpee", &args->vdso_sym_rt,
args->vdso_rt_parked_at,
- i, args->tgt_vmas, args->nr_vmas))
+ i, args->vmas, args->vmas_n))
goto core_restore_end;
break;
}
@@ -890,8 +890,8 @@ long __export_restore_task(struct task_restore_args *args)
* Walk though all VMAs again to drop PROT_WRITE
* if it was not there.
*/
- for (i = 0; i < args->nr_vmas; i++) {
- vma_entry = args->tgt_vmas + i;
+ for (i = 0; i < args->vmas_n; i++) {
+ vma_entry = args->vmas + i;
if (!(vma_entry_is(vma_entry, VMA_AREA_REGULAR)))
continue;
@@ -907,10 +907,10 @@ long __export_restore_task(struct task_restore_args *args)
/*
* Finally restore madivse() bits
*/
- for (i = 0; i < args->nr_vmas; i++) {
+ for (i = 0; i < args->vmas_n; i++) {
unsigned long m;
- vma_entry = args->tgt_vmas + i;
+ vma_entry = args->vmas + i;
if (!vma_entry->has_madv || !vma_entry->madv)
continue;
@@ -936,7 +936,7 @@ long __export_restore_task(struct task_restore_args *args)
* up AIO rings.
*/
- for (i = 0; i < args->nr_rings; i++) {
+ for (i = 0; i < args->rings_n; i++) {
struct rst_aio_ring *raio = &args->rings[i];
unsigned long ctx = 0;
int ret;
@@ -1157,11 +1157,11 @@ long __export_restore_task(struct task_restore_args *args)
sys_sigaction(SIGCHLD, &args->sigchld_act, NULL, sizeof(k_rtsigset_t));
- ret = restore_signals(args->siginfo, args->siginfo_nr, true);
+ ret = restore_signals(args->siginfo, args->siginfo_n, true);
if (ret)
goto core_restore_end;
- ret = restore_signals(args->t->siginfo, args->t->siginfo_nr, false);
+ ret = restore_signals(args->t->siginfo, args->t->siginfo_n, false);
if (ret)
goto core_restore_end;
--
1.9.3
More information about the CRIU
mailing list